我正在尝试在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
答案 0 :(得分:3)
您的第二个realloc
(用于分配新行)应该是malloc
。此时,playfield[cnt]
包含未初始化的数据,因此尝试重新分配它可能会导致段错误。