c - 重新分配两次后的段错误
问题描述
我试图编写一个函数,它接受一个没有给出长度的输入。当我尝试获得单个输入时它可以工作,但是如果我想获得多个输入,我会遇到段错误。下面是代码:
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)
一种更有效的技术是“不时”重新分配,跟踪分配的缓冲区的容量,就像大多数向量分配器所做的那样,而不是每次。
推荐阅读
- java - Spring MVC 轮播
- android - Ionic Cordova 7.1.4 Android 构建失败
- c++ - 如何处理来自另一个线程的 win32 事件?
- python - Python从字符串中删除嵌套的unicode'u'符号
- amazon-web-services - 无法使用 Postman 使用预签名 URL 将文件上传到 S3。错误:签名不匹配
- javascript - 将元素绝对定位在部分底部会添加不需要的第二个滚动条
- c# - 使用多个用户控件从 Mysql 数据库加载大数据的最佳方法
- html - 每行中具有相同高度单元格的表格布局
- php - 通过 PDO fetchAll (PDO::FETCH_OBJ) 获取从 DB 检索到的对象的属性
- reactjs - ReactJS 组件状态没有按预期改变