Segfault после realloc дважды - PullRequest
0 голосов
/ 28 апреля 2019

Я пытался написать функцию, которая принимает данные без заданной длины.Это работает, когда я пытаюсь получить один вход, но если я хочу получить несколько входов, я получаю segfault.Ниже приведен код:

char* getinput()
    {
    char c,*str=0,*tmp=0;
    int i=0;

    while(c)
    {
            c=getchar();

            if(c!=EOF && c!='\n')
        {
            if(!(tmp=realloc(str,(i+1)*sizeof(char))))
            {
            free(str);
            return NULL;
            }

        str=tmp;
        str[i++]=c;
        }
        else c=0;
    }

    str[i]=0;
    return str;
}

Когда я пытаюсь получить один вход, я могу напечатать строку:

string1      
string1

Когда я пытаюсь получить несколько входов, я не могу:

string1
Segmentation fault (core dumped)

Есть еще одна переменная string2.Я ценю любую помощь.Спасибо.

1 Ответ

1 голос
/ 28 апреля 2019

допустим, что вы вводите один символ

Вы выделите буфер размером один байт, запишите в него символ, затем увеличите индекс и выполните:

str[i]=0;

на данный момент i==1 и вы пишете за пределами str выделенные границы: неопределенное поведение

Я предлагаю вам увеличить размер буфера на один:

if(!(tmp=realloc(str,(i+2)))

(и сбросить sizeof(char) бит, поскольку он гарантированно равен 1)

Более эффективным методом было бы перераспределение "время от времени", отслеживая емкость выделенного буфера, какбольшинство распределителей векторов делают это вместо каждого раза.

...