动态内存分配 - 二维数组

时间:2014-01-07 20:18:10

标签: c arrays memory-management dynamic

我在理解指针和动态内存分配方面遇到了一些麻烦。我写了这两个代码:

    int **array;
    array = malloc(nrows * sizeof(int *));
    if(array == NULL)
    {
        fprintf(stderr, "out of memory\n");
        return -1;
    }
        for(i = 0; i < nrows; i++)
    {
        *(array+i) = malloc(ncolumns * sizeof(int));
        if(array[i] == NULL)
        {
            fprintf(stderr, "out of memory\n");
            return -1;
        }
    }

    int **array;
    array = malloc(nrows * sizeof(int *));
    if(array == NULL)
    {
        fprintf(stderr, "out of memory\n");
        return -1;
    }
        for(i = 0; i < nrows; i++)
    {
        array[i] = malloc(ncolumns * sizeof(int));
        if(array[i] == NULL)
        {
            fprintf(stderr, "out of memory\n");
            return -1;
        }
    }

他们应该为二维数组分配空间。虽然我不确定它们是否正确,但我的意思是:这一行:

array[i] = malloc(ncolumns * sizeof(int));

完成同样的事情:

*(array+i) = malloc(ncolumns * sizeof(int));

4 个答案:

答案 0 :(得分:3)

array[i]*(array+i)i[array]被编译器视为相同的东西。

答案 1 :(得分:2)

是的,在编译代码时,它们都应该被视为相同。

答案 2 :(得分:2)

*(array + i)array[i]都评估相同的事情(假设一个是指针而另一个是整数)。为了您的理智和其他人的使用,请使用第二种形式;它会更容易阅读和维护。

如果您在编译时知道数组维度的大小,或者如果您正在使用支持可变长度数组的编译器,则可以稍微简化一下:

int (*array)[ncols] = malloc( sizeof *array * nrows );

这将为nrows x ncols int数组分配足够的内存。如果您正在使用不支持可变长度数组的编译器,则必须在编译时知道ncols(即,它必须是宏或其他编译时常量)。您可以像访问任何常规2D数组一样访问数组元素:

array[i][j] = x;

这种方法相对于两步法的一个优点是所有内存都是连续分配的;也就是说,所有行都将在内存中相邻。如果您希望将数组视为单个连续的数据blob(例如,如果您通过write系统调用通过套接字发送它),则这很重要。使用两步法,不能保证所有行都是相邻的。

另一个好处是,释放只需要一次调用free

free( array );

答案 3 :(得分:1)

int **array;
array = malloc(nrows * sizeof(int *));

变量数组是指针或双指针变量的数组。这些指针的值在下一个数组分配中完成:

array[i] = malloc(ncolumns * sizeof(int)); or 
*(array+i) = malloc(ncolumns * sizeof(int));

array [i] ==&GT;我是数组的索引,包含由malloc(ncolumns * sizeof(int));

分配的指针的值

*(array + i) ==&gt;是用于解析数组的偏移量,* array + i)是由malloc(ncolumns * sizeof(int));分配的指针的值

所以

array[i] = malloc(ncolumns * sizeof(int));
and 
*(array+i) = malloc(ncolumns * sizeof(int));

完全相同