Domanda

Ho seguente codice

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

ottengo questo errore riallocazione:

*** 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]

Qual è il mio problema qui ???

Grazie, saluta

È stato utile?

Soluzione

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

Qui probabilmente voleva utilizzare sizeof (char *)

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

Qui si sta loop 256 volte (wordLenght), ma si deve solo 2 volte (arrayLength). Inoltre, probabilmente si voleva utilizzare sizeof (char) al posto di sizeof (StringArray).

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

Questa verifica dovrebbe essere fatta prima di chiamare fgets, perché in questo momento si sta utilizzando in primo luogo della memoria e poi li allocare.

Inoltre dopo aver riallocare StringArray è necessario allocare resto stringhe utilizzando qualcosa di simile

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

E infine è necessario liberare tutta la memoria allocata prima dell'applicazione uscita.

Altri suggerimenti

Probabilmente non sizeof(*stringArray) media

In realtà credo che si potrebbe voler relook alla chiamata calloc troppo, penso che si assegnano le dimensioni del puntatore là (tempi lunghezza di parola).

Dopo la prima volta esegue linea:

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

quindi StringArray [arrayLength / 2] sarà un valore di spazzatura - non è stato impostato a punto allo stoccaggio per la parola.

Questa parte dovrebbe utilizzare sizeof uso (** StringArray), o 1 come ** StringArray è char, e il contatore deve solo salire a arrayLength:

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

Invece allocare in un blocco:

 char* block = malloc(wordLength * arrayLength);

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

Al momento, è possibile che ci sia qualche spazio dopo StringArray, in cui si memorizzano i (wordlength-arrayLength) puntatori in più quando si calloc loro, e realloc non si muove StringArray.

E 'molto probabile che 0xb49010 è uno dei puntatori si calloc'd, e tu sei sovrascritti la memoria in cui malloc mantiene la sua dimensione del blocco ..

Ma dal momento che si sta scrivendo l'estremità del StringArray, siete in un comportamento indefinito in ogni caso.

L'approvazione qui è l'intera soluzione:

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

Come è il modo migliore per liberare lo spazio?!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top