带有calloc的简单二维数组导致分段错误

时间:2017-04-24 22:12:11

标签: c dynamic-allocation calloc

我得到一个奇怪的“Segmentation fault:11”这个简单的代码,无法弄清楚是什么问题。我只需要使用size nrows x ncolumns动态声明和数组。

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

int main()
{
    int nrows = 3;
    int ncolumns = 5;

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

    for(int i = 0; i < nrows; i++)
    {
        for(int j = 0; j < ncolumns; j++)
        {
            array[i][j] = 10;
            printf("%d %d: %d\n",i,j, array[i][j]);
        }   
    }
    return 0;
}

1 个答案:

答案 0 :(得分:4)

你正在混淆你的比喻。您声明您的数组是一个指针块,但随后分配int大小的内存块。你可能只是逃避这里指针的大小是一个int的大小,但它仍然是不正确的。

最简单的选择是使它成为一个简单的一维数组,您可以使用行和列步长(即array[row*ncolumns + column])进行访问,或者在整个过程中更彻底地使用指针。

请注意,您不能使用doubled up数组语法来访问这种动态分配的2D数组,因为编译器不知道内部数组的大小,因此,外部数组的步幅。 / p>