我有以下代码
int wordLenght = 256, arrayLength = 2, i = 0, counter = 0;
char **stringArray = NULL;
stringArray = calloc(arrayLength, sizeof(*stringArray));
for(counter; counter<wordLenght; counter++)
stringArray[counter] = calloc(wordLenght, sizeof(stringArray));
while(1)
{
printf("Input: ");
fgets(stringArray[i], wordLenght, stdin);
printf("stringArray[%d]: %s\n", i, stringArray[i]);
if(i == arrayLength)
{
printf("Reallocation !!!\n");
arrayLength *= 2;
stringArray = realloc(stringArray, arrayLength*sizeof(*stringArray));
}
i++;
}
我收到了这个重新分配错误:
*** glibc detected *** ./stringArray: realloc(): invalid next size: 0x0000000000b49010 ***
======= Backtrace: =========
/lib/libc.so.6(+0x775b6)[0x7f4dd12565b6]
/lib/libc.so.6(+0x7dd66)[0x7f4dd125cd66]
/lib/libc.so.6(realloc+0xf0)[0x7f4dd125d080]
./stringArray[0x4007f9]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f4dd11fdc4d]
./stringArray[0x400629]
这里有什么问题???
谢谢,问候
答案 0 :(得分:2)
你可能并不是指sizeof(*stringArray)
事实上我相信你也可能想要查看calloc
调用,我认为你在那里分配指针的大小(字长时间)。
答案 1 :(得分:2)
stringArray = calloc(arrayLength, sizeof(*stringArray));
在这里你可能想要使用sizeof(char *)
for(counter; counter<wordLenght; counter++) stringArray[counter] = calloc(wordLenght, sizeof(stringArray));
这里循环256次(wordLenght),但你应该只循环2次(arrayLength)。另外,您可能希望使用sizeof(char)而不是sizeof(stringArray)。
if(i == arrayLength) {...}
这个检查应该在你调用fgets之前完成,因为你现在首先使用内存然后分配它们。
此外,在重新分配stringArray之后,您需要使用类似
之类的内容分配其余字符串for(counter = i; counter<arrayLength; counter++) stringArray[counter] = (char*)calloc(wordLenght, sizeof(char));
最后,您需要在退出应用程序之前释放所有已分配的内存。
答案 2 :(得分:0)
第一次执行此行后:
stringArray = realloc(stringArray, arrayLength*sizeof(*stringArray));
然后stringArray [arrayLength / 2]将是一个垃圾值 - 你没有将它设置为指向该单词的存储。
这部分应该使用sizeof(** stringArray)或1作为** stringArray是char,而计数器应该只到arrayLength:
for(counter; counter<wordLenght; counter++)
stringArray[counter] = calloc(wordLenght, sizeof(stringArray));
而是在一个区块中分配:
char* block = malloc(wordLength * arrayLength);
for ( counter; counter < arrayLength; ++counter )
stringArray[counter] = block + ( counter * wordLength );
目前,stringArray之后可能存在一些空间,当你调用它们时,你会在其中存储(wordLength-arrayLength)额外指针,而realloc不会移动stringArray。
很可能0xb49010是你调用的指针之一,并且你覆盖了malloc保持其块大小的内存。
但是既然你正在写下stringArray的结尾,那么无论如何你都会陷入未定义的行为。
答案 3 :(得分:0)
好的,这是整个解决方案:
int wordLength = 256, arrayLength = 2, i = 0, counter = 0;
char **stringArray = NULL;
char buffer[wordLength];
stringArray = calloc(arrayLength, sizeof(char*));
for(counter; counter<arrayLength; counter++) stringArray[counter] = (char*)calloc(wordLength, sizeof(char));
while(1)
{
if(i == arrayLength)
{
printf("Reallocation !!!\n");
arrayLength *= 2;
stringArray = realloc(stringArray, arrayLength*sizeof(char*));
for(counter = i; counter<arrayLength; counter++) stringArray[counter] = (char*)calloc(wordLength, sizeof(char));
}
printf("Input: ");
fgets(buffer, wordLength, stdin);
if(!strcmp(buffer,"q\n")) break; // also free here
else stringArray[i] = buffer;
printf("stringArray[%d]: %s\n", i, stringArray[i]);
i++;
}
如何释放空间的最佳方法是什么?!