检测到glibc,realloc():旧的大小C无效

时间:2014-03-11 22:10:16

标签: c string glibc realloc

不可否认,我试图做的最多是受过良好教育的猜测工作。

我有一个字符串数组,我试图说明是否有人输入了一个太大的字符串,或者数组收到了太多的输入(它需要是动态的我想要做的事情) )

这里是破坏的代码部分:

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个小字进行测试并且它崩溃了试图调整大小)

1 个答案:

答案 0 :(得分:1)

你需要

wordarray = malloc(numwords * sizeof *wordarray);

另外,如果在没有断言的情况下编译程序并在内存不足的系统上运行,您希望发生什么? 我的意思是,使用assert()可能不对。