Riallocare un array di char 2d
-
02-10-2019 - |
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 ??p>
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?!