gpt4 book ai didi

c - 看似随机的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:53 26 4
gpt4 key购买 nike

我正在尝试在 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");
}

但是,当使用不断增加 1 的 y 值访问数组时,我遇到了段错误。这是程序打印出来的内容:

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

当我一开始使用一些 <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

最佳答案

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

关于c - 看似随机的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4689471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com