C - realloc 导致指针数组的 glibc 错误



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

  • 分配大小dictionary dictionary_size初始化为 50 的指针数组
  • 将所有空格和替换为"\0"
  • 将每 3 个字符串(由未知数量的 或空格分隔)的地址存储在dictionary
  • 如果dictionary已满,则重新分配大小,dictionary_size * 2

但是,该代码会导致以下错误:-

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

代码如下:-

 // Replace all spaces with ''
  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] = '';
      }
      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 %dn", dictionary_size);
        dictionary = (char **)realloc(dictionary, dictionary_size);
      }
    }
  }

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

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是否正确初始化。

您分配的内存太少。该错误是由垃圾箱引起的(您永远无法知道哪个错误实际上会从垃圾箱中出现)。

如果分配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 %dn", dictionary_size);
    dictionary = (char **)realloc(dictionary, dictionary_size * sizeof(char *));
  }
  dictionary[k++] = temp_buffer+i;
... etc ...

所以你绝对确定,无论k是什么,你都有足够的空间来存放字典[k]。

最新更新