栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

realloc(): invalid next size: C语言报错

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

realloc(): invalid next size: C语言报错

老实说我这个错误绝对很难碰到,上代码

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)='';
	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;
		}
	}

修改完毕

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990241.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号