不可否认,我试图做的最多是受过良好教育的猜测工作。
我有一个字符串数组,我试图说明是否有人输入了一个太大的字符串,或者数组收到了太多的输入(它需要是动态的我想要做的事情) )
这里是破坏的代码部分:
if (strlen(token) > wordlength)
{
wordlength *= 2;
for(int j = 0; j < numwords; j++)
{
char* tmpw = realloc(wordarray[j], wordlength);
assert(tmpw != NULL);
wordarray[j] = tmpw;
printf("increased size of words to %zu \n", wordlength);
}
}
说明:
Token是接下来的单词(我正在解析一个字符串)所以我将它与当前的单词长度进行比较,如果它太大了,我会加倍字长并尝试调整数组相应
如果您需要更多信息,请告诉我
wordarray的初始化:
wordarray = malloc(numwords);
for(int i = 0; i < numwords; i++)
wordarray[i] = malloc(wordlength);
另一个realloc崩溃的地方:
if (arraycounter > numwords)
{
numwords *= 2;
char** tmp = realloc(wordarray, numwords);
assert(tmp != NULL);
wordarray = tmp;
for(int h = arraycounter; h < numwords; h++)
wordarray[h] = malloc(wordlength);
printf("increased size of wordarray to %zu \n", numwords);
}
在这种情况下,如果数组即将超过初始设置限制,它将尝试增加数组的大小,因此不会因令牌耗尽内存而受到影响(使用20个小字进行测试并且它崩溃了试图调整大小)
答案 0 :(得分:1)
你需要
wordarray = malloc(numwords * sizeof *wordarray);
另外,如果在没有断言的情况下编译程序并在内存不足的系统上运行,您希望发生什么? 我的意思是,使用assert()
可能不对。