首页 > 解决方案 > 重新分配两次后的段错误

问题描述

我试图编写一个函数,它接受一个没有给出长度的输入。当我尝试获得单个输入时它可以工作,但是如果我想获得多个输入,我会遇到段错误。下面是代码:

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。我很感激任何帮助。谢谢你。

标签: csegmentation-faultrealloc

解决方案


假设您输入了一个字符

您将分配一个字节的缓冲区,将字符写入其中,然后增加索引并执行以下操作:

str[i]=0;

此时i==1,您正在编写超出str分配的范围:未定义的行为

我建议您将缓冲区大小增加一:

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

(并丢弃sizeof(char)位,因为它保证为 1)

一种更有效的技术是“不时”重新分配,跟踪分配的缓冲区的容量,就像大多数向量分配器所做的那样,而不是每次。


推荐阅读