我有一些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]。