老实说我这个错误绝对很难碰到,上代码
int mygetline(char**line,int *n ,FILE* stream)
{
int i=0,c;
char *buf = *line;
if((*line==NULL)||(*n==0))
{
*line=(char*)malloc(10);
buf=*line;
*n=10;
}
while((c=fgetc(stream))!='\n')
{
if(c==EOF)
return -1;
if(i<*n-2)
*(buf+i++)=c;
else
{
buf=(char*)realloc(buf,*n);
if(buf==NULL)
{
perror("no mem");
exit(1);
}
*n=*n+10;
*(buf+i++)=c;
}
}
*(buf+i++)='\n';
*(buf+i)='\0';
return i;
}
这个是我仿写的getline,报错了,看了许久无果,来一段官方解释
realloc () 函数应将ptr指向的内存对象 的大小更改为 size 指定的 大小。对象的内容应保持不变,直至新旧尺寸中的较小者。如果内存对象的新大小需要移动对象,则释放对象先前实例化的空间。如果新大小更大,则未指定对象新分配部分的内容。如果size为 0 且ptr不是空指针,则释放指向的对象。如果无法分配空间,则对象应保持不变。
如果ptr是一个空指针,realloc () 应该等效于malloc () 用于指定的大小。
如果ptr与calloc ()、 malloc () 或realloc ()先前返回的指针不匹配,或者如果空间先前已通过调用free () 或realloc () 释放,则行为未定义。
连续调用realloc () 分配的存储的顺序和连续性是未指定的。如果分配成功,则返回的指针应适当对齐,以便可以将其分配给指向任何类型对象的指针,然后用于访问已分配空间中的此类对象(直到空间被显式释放或重新分配)。每个这样的分配都应产生一个指向与任何其他对象不相交的对象的指针。返回的指针应指向分配空间的开始(最低字节地址)。如果无法分配空间,则返回空指针
看到了嘛解释中有size大于原来内存的解释也有小于的解释,就是没有等于size的解释,也就是说这是未定义行为,那我的代码真好是踩上了这个地方
while((c=fgetc(stream))!='\n')
{
if(c==EOF)
return -1;
if(i<*n-2)
*(buf+i++)=c;
else
{
*n=*n+10;
buf=(char*)realloc(buf,*n);
if(buf==NULL)
{
perror("no mem");
exit(1);
}
*(buf+i++)=c;
}
}
修改完毕