Перераспределить 2 -й массив
-
02-10-2019 - |
Вопрос
У меня есть следующий код
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]
В чем моя проблема здесь ???
Спасибо, приветствует
Решение
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));
И, наконец, вам нужно освободить всю выделенную память перед выходом из приложения.
Другие советы
Вы, вероятно, не имели в виду sizeof(*stringArray)
На самом деле я считаю, что вы можете захотеть пересмотреть calloc
Позвоните тоже, я думаю, что вы распределяете размер указателя там (время длины слова).
После первого раза эта строка выполняется:
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), когда вы их Calloc их, и Realloc не перемещает StringArray.
Вполне вероятно, что 0xb49010 является одним из указателей, которые вы Calloc'd, и вы перезаписываете память, где Malloc сохраняет размер блока.
Но так как вы списываете конец Stringarray, вы все равно увлекаетесь неопределенным поведением.
Хорошо, вот все решение:
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++;
}
Как лучше всего освободить пространство?!