realloc导致指针数组的glibc错误

时间:2014-01-14 11:44:03

标签: c realloc

我有一些C代码,其中包含我试图以下列方式操作的文本数组: -

  • 分配大小为dictionary的指针数组dictionary_size,初始化为50
  • 用' \ 0'
  • 替换所有空格和\ n&n;
  • dictionary
  • 中存储每个第3个字符串的地址(由未知数量的\ n' s或空格分隔)
  • 如果dictionary已满,请重新评估为dictionary_size * 2

然而,代码会导致以下错误: -

*** glibc detected *** ./crack: realloc(): invalid next size: 0x0000000001386010 ***
^Cmake: *** [run] Interrupt

代码如下: -

 // Replace all spaces with '\0'
  for ( i = 0; i < file_size; i++ ) {
    if ( temp_buffer[i] == ' ' || temp_buffer[i] == '\n' ) {
      while ( temp_buffer[i] == ' ' || temp_buffer[i] == '\n' ) {
        temp_buffer[i] = '\0';
      }
      j++;
    }
    if ( (j-1) % 3 == 0 ) {
      dictionary[k] = temp_buffer+i;
      k += 1;
      if ( k == dictionary_size ) {
        dictionary_size *= 2;
        printf("Going to realloc to %d\n", dictionary_size);
        dictionary = (char **)realloc(dictionary, dictionary_size);
      }
    }
  }

[编辑] 根据我的调试语句,第一个realloc(大小为100)失败。

2 个答案:

答案 0 :(得分:2)

dictionary_size是元素(指针)计数,而不是分配大小。应为dictionary_size * sizeof(char*)

dictionary = realloc(dictionary, dictionary_size * sizeof(*dictionary)); // safer, 10x @alk

或(较少推荐):

dictionary = realloc(dictionary, dictionary_size * sizeof(char*));       // clearer

同时检查dictionary_size是否已正确初始化。

答案 1 :(得分:0)

你分配的内存太少了。该错误是由于破坏内存造成的(你永远无法知道哪些错误实际上会从破坏的内存中产生)。

如果你分配dictionary_size个字节,你就有dictionary_size/sizeof(char *)个指针的空间。

相反,您的if声明表明您认为dictionary_size指针有空间,但事实并非如此。

将malloc / realloc更改为:

dictionary = (char **)realloc(dictionary, dictionary_size * sizeof(char *));

顺便说一下,你不需要转发realloc。

作为最后的建议,考虑到realloc(NULL, ...)等同于malloc(),可能更容易编写类似的内容:

  dictionary = NULL;
...  other code here ...
  if ( k >= dictionary_size ) {
    while (k >= dictionary_size) dictionary_size *= 2;
    printf("Going to realloc to %d\n", dictionary_size);
    dictionary = (char **)realloc(dictionary, dictionary_size * sizeof(char *));
  }
  dictionary[k++] = temp_buffer+i;
... etc ...

所以你绝对相信无论k是什么,你都有充足的词典空间[k]。