我有一些C代码,其中包含我试图以下列方式操作的文本数组: -
dictionary
的指针数组dictionary_size
,初始化为50 dictionary
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)失败。
答案 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]。