realloc (): неверный следующий размер - PullRequest
0 голосов
/ 17 февраля 2012

, поэтому у меня есть код, который отлично работает с небольшими текстовыми файлами, но вылетает с большими. Смысл кода в том, чтобы взять файл и параметр n, проанализировать код и сохранить все в 2d массиве в кусках размера n. Таким образом, буфер [0] [0] - [0] [n-1] должен содержать n символов, а буфер [1] [0] - [1] [n-1] должен содержать следующий n чанк и так далее. Мой код работает, когда файл содержит всего несколько слов, но с большим файлом я получаю сообщение об ошибке: realloc (): недопустимый следующий размер. Есть идеи почему? Вот мой код.

void bsort(int n)
{
    int numwords= 0;
    int numlets=0;
    char ** buffer=(char**)malloc(numwords*n); 
    while (!feof(stdin))
    {
        char l= getchar();
        if (l!= EOF) 
        {
            if (numlets%n==0)
            {
                numwords=numwords+1;
                buffer=(char**)realloc(buffer,numwords*n);
                if(!buffer)
                {
                    printf("Allocation error!");
                }
                buffer[numwords-1]= (char*) malloc (n);
                buffer[numwords-1][numlets%n]=l;
                // printf("%c", buffer[numwords-1][numlets%n]);
                numlets=numlets+1;
            }
        }

        int i,j;
        for (i=0; i < numwords; i++)
        {
            for(j=0; j< n; j++)
            {
                printf("%c",buffer[i][j]);
            }

        }

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

Похоже, что каждый раз, когда вы получаете персонажа, вы перераспределяете свой буфер.Это кажется мне немного странным.Задумывались ли вы над тем, чтобы выделить некоторое пространство, сделать memset для \0 и просто управлять текущим размером и размером буфера отдельно?Если после первого ввода символов произойдет сбой, возможно, у вас возникли проблемы с вашим первым malloc().Предварительное выделение некоторого пространства решит эту проблему.

0 голосов
/ 17 февраля 2012

AFAIK, malloc(0) не гарантирует возврата полезного указателя, который вы можете realloc().

Документация только гарантирует, что malloc(0) вернет либо ноль, либо указатель, который можно безопасно использовать для вызова free().

...