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
 stringArray = calloc(arrayLength, sizeof(*stringArray));

ここでは、おそらく sizeof(char*) を使用したいと考えていました

for(counter; counter<wordLenght; counter++) stringArray[counter] = calloc(wordLenght, sizeof(stringArray));

ここでは 256 回 (wordLength) ループしていますが、2 回 (arrayLength) しかループできません。さらに、おそらく sizeof(stringArray) の代わりに sizeof(char) を使用したいでしょう。

if(i == arrayLength) {...}

このチェックは、fgets を呼び出す前に行う必要があります。これは、現在、最初にメモリを使用し、後でそれらを割り当てるためです。

さらに、stringArray を再割り当てした後、次のようなものを使用して残りの文字列を割り当てる必要があります

for(counter = i; counter<arrayLength; counter++) stringArray[counter] = (char*)calloc(wordLenght, sizeof(char));

最後に、アプリケーションを終了する前に、割り当てられたすべてのメモリを解放する必要があります。

于 2010-07-06T13:42:28.837 に答える
2

あなたはおそらく意味がなかったsizeof(*stringArray)

実際、呼び出しも見直す必要があるcallocと思います。そこにポインターのサイズを割り当てていると思います(ワード長の時間)。

于 2010-07-06T12:54:45.757 に答える
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 に答える
0

この行が最初に実行された後:

stringArray = realloc(stringArray, arrayLength*sizeof(*stringArray));

stringArray[arrayLength/2] はガベージ値になります-単語のストレージを指すように設定していません。

この部分では、sizeof(**stringArray) を使用するか、**stringArray が char であるため 1 を使用する必要があり、カウンターは arrayLength までしか上昇しない必要があります。

 for(counter; counter<wordLenght; counter++) 
     stringArray[counter] = calloc(wordLenght, sizeof(stringArray));

代わりに、1 つのブロックに割り当てます。

 char* block = malloc(wordLength * arrayLength);

 for ( counter; counter < arrayLength; ++counter ) 
     stringArray[counter] = block + ( counter * wordLength );

現時点では、stringArray の後にスペースがあり、(wordLength-arrayLength) 余分なポインターを calloc するときにそこに格納している可能性があり、realloc は stringArray を移動しません。

0xb49010 は、呼び出したポインターの 1 つである可能性が非常に高く、malloc がブロック サイズを保持するメモリを上書きしています。

しかし、あなたは stringArray の終わりを書いているので、とにかく未定義の動作になります。

于 2010-07-06T13:35:46.553 に答える