重新分配两次后出现段错误
Segfault after realloc twice
我正在尝试编写一个函数,它接受没有给定长度的输入。它在我尝试获取单个输入时有效,但如果我想获取多个输入,则会出现段错误。下面是代码:
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。我感谢任何帮助。谢谢。
假设您输入了一个个字符
你将分配一个一个字节的缓冲区,将字符写入其中然后增加索引并执行:
str[i]=0;
此时 i==1
并且您正在 str
分配的范围之外编写:未定义的行为
我建议您将缓冲区大小增加一:
if(!(tmp=realloc(str,(i+2)))
(并删除 sizeof(char)
位,因为它保证为 1)
一种更有效的技术是重新分配 "from time to time",跟踪已分配缓冲区的容量,就像大多数向量分配器所做的那样,而不是每次都这样做。
我正在尝试编写一个函数,它接受没有给定长度的输入。它在我尝试获取单个输入时有效,但如果我想获取多个输入,则会出现段错误。下面是代码:
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。我感谢任何帮助。谢谢。
假设您输入了一个个字符
你将分配一个一个字节的缓冲区,将字符写入其中然后增加索引并执行:
str[i]=0;
此时 i==1
并且您正在 str
分配的范围之外编写:未定义的行为
我建议您将缓冲区大小增加一:
if(!(tmp=realloc(str,(i+2)))
(并删除 sizeof(char)
位,因为它保证为 1)
一种更有效的技术是重新分配 "from time to time",跟踪已分配缓冲区的容量,就像大多数向量分配器所做的那样,而不是每次都这样做。