重新分配2d char数组

时间:2010-07-06 12:50:00

标签: c char multidimensional-array realloc

我有以下代码

 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 个答案:

答案 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++;
    }

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