在C中动态分配2D数组时的运行时错误

时间:2014-04-10 22:58:03

标签: c arrays multidimensional-array

我正在尝试动态分配2D数组,放置一些值和打印输出。但是我似乎在输入atoi()函数中的程序时犯了错误。

基本上,当我们分配静态2D数组时,我们将其声明为int a [3] [3]。因此,如果为3 * 3单位,则分配大量内存。同样适用于分配动态数组吗?

这是我的代码:

#include<stdio.h>
#include<stdlib.h>

int main(int arg,char* argv)
{
int rows = atoi(argv[1]);
int col = atoi(argv[2]);

int rows =3;
int col=3;
int i,j;

int (*arr)[col] = malloc(sizeof (*arr)*rows);

int *ptr = &(arr[0][0]);
int ct=1;
for (i=0;i<rows;i++)
{
    for(j=0;j<col;j++)
    {
        arr[i][j]=ct;
        ct++;
    }
}   

printf("printing array \n");
for (i=0;i<rows;i++)
{
    for(j=0;j<col;j++)
    {
        printf("%d \t",arr[i][j]);
    }
    printf("\n");
}   

free(arr);

return (0);
}

程序在运行时崩溃。有人可以评论吗?

2 个答案:

答案 0 :(得分:0)

我看到的第一个问题是这一行:

int (*arr)[rows][col] = malloc(sizeof (*arr) * rows);

这根本不成问题,因为您实际上分配的内存超出了您的需要。这就足够了:

int (*arr)[rows][col] = malloc(sizeof (*arr));

sizeof *arr就足够了,因为*arr的类型为int [rows][cols];你想要的内存正是那个数组的大小。 sizeof运算符在应用于数组时会为您提供整个数组的计数。

但是,代码的主要问题是如何使用arr。您使用arr[i][j]为其编制索引,但是您应该使用(*arr)[i][j],因为arr 不是数组,它是指向数组的指针。您需要在进行任何进一步索引之前取消引用它 - 就这么简单。 arr[i][j]相当于*(*(arr+i)+j)。请注意,i应该是*arr的偏移,而不是arr的偏移。这就是为什么你需要在索引之前取消引用arr

答案 1 :(得分:0)

由于您已经在使用可变长度数组,因此您可以利用它:

int (*arr)[col] = malloc(sizeof *arr * rows);

通过这种方式,您只需使用通常的语法arr[i][j]访问元素,而无需担心指针和解引用,指针算法将为您完成所有工作。

此外,由于索引从0开始,您的测试应该看起来像i < rowsj < col。 对于错误的main声明和第二个printf,您会遇到一些小错误。