2

我有以下代码

 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]

我这里有什么问题???

谢谢,问候

4

4 回答 4

2

你可能不是这个意思sizeof(*stringArray)

事实上,我相信您可能也想重新查看calloc调用,我认为您正在那里分配指针的大小(字长时间)。

于 2010-07-06T12:54:45.757 回答
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));

最后,您需要在退出应用程序之前释放所有分配的内存。

于 2010-07-06T13:42:28.837 回答
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 的末尾,因此无论如何您都会陷入未定义的行为。

于 2010-07-06T13:35:46.553 回答
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++;
    }

释放空间的最佳方法是什么?!

于 2010-07-06T18:09:04.703 回答