看似随意的段错误

时间:2011-01-14 09:06:33

标签: c segmentation-fault

我正在尝试在C中实现动态二维数组。

每当程序试图访问数组中的值时,我都在检查数组是否足够大。如果没有更多的存储应该分配。下面的代码检查数组是否有足够的列,如果没有,则重新分配新的内存。

unsigned long cnt; // y is the element we are trying to access, playfieldsize stores the size of the array
if (y >= playfieldsize.y) { // if the array isn't large enough more data should be allocated
    char **tmp;
    unsigned long cnt;
    cnt = playfieldsize.y; // stores the old size of the array
    playfieldsize.y += (y - playfieldsize.y) + INCREASE; // the new array size
    if (tmp = realloc(playfield, playfieldsize.y * sizeof(char *))) { // if storage can be allocated for the new size
        playfield = tmp;
        for (; cnt<playfieldsize.y; cnt++) { // for every new column a row is added
            char *tmp;
            printf("cnt=%lisize=%li\n", cnt, playfieldsize.y); // added for debugging purpose
            if (tmp = realloc(playfield[cnt], sizeof(char) * playfieldsize.x)) // segfault happens here
                playfield[cnt] = tmp;
            else
                die("Not enough initial memory");
        }
    } else // if storage could not be reallocated
        die("Not enough initial memory");
}

然而,当使用 y 值访问数组时,我会遇到分段错误,该值不断增加1。这是程序打印出来的:

...
cnt=327size=330
cnt=328size=330
cnt=329size=330
cnt=330size=360
cnt=331size=360
Segmentation fault

当我开始使用少量&lt; 10 y 值访问数组时,我得到了这个段错误,然后是301中的一个:

...
cnt=27size=30
cnt=28size=30
cnt=29size=30
cnt=30size=330
cnt=31size=330
Segmentation fault

所以在第一个例子中,它在错误发生之前将行初始化为331,在第二个例子中它在31处失败。我无法确定发生了什么,对我来说似乎很随意。

如果需要,这是整个程序:http://pastebin.com/13mRDh8A

1 个答案:

答案 0 :(得分:3)

您的第二个realloc(用于分配新行)应该是malloc。此时,playfield[cnt]包含未初始化的数据,因此尝试重新分配它可能会导致段错误。