Вопрос

У меня есть следующий код

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

Как лучше всего освободить пространство?!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top