C realloc(): invalid next size错误
C realloc(): invalid next size 问题代码
#include
#include int *getNumber();
void printfList(int const* list);
int main(){
int *list = getNumber();
printfList(list);
free(list);
return 0;
}int *getNumber(){
int *list = (int *)calloc(1, sizeof(int));
int count = 0;
*list = count;
int num = 0;
while (scanf("%d", &num) == 1){
list[0] = ++count;
list = realloc(list, sizeof(int) * count);
list[count] = num;
}
return list;
}void printfList(int const* list){
int count = *list++;
for (int i=0;
i < count;
i++)
printf("%d,", *list++);
printf("\n");
}
【C realloc(): invalid next size错误】这个代码大致的工作是从
stdin
中读取数字,并且写入到数组中,其中数组的第一个元素记录的是读取数字的个数。出现有问题的代码位于此处:
list = realloc(list, sizeof(int) * count);
问题分析 在经过一番折腾之后,关于出现
list = realloc(list, sizeof(int) * count);
错误的原因我在网上大致了解了,主要有如下:- 计算长度的方式不对,比如:
char *tmp = calloc(1, sizeof(char);
// 经过一系列操作
tmp = realloc(tmp, sizeof(char *)*10);
两次计算长度使用的
sizeof
中的类型不同,虽然这不一定是代码错误,但通常他不是我们想要的结果。- 越界读取,这通常不仅会导致
realloc
有问题,还可能会导致free
等操作有问题。
realloc
申请的内存比原来的内存小。我没有求证过这个错误,但据我所知,realloc
不仅可以扩大内存,还可以缩小内存的。解决问题 我的问题非常奇怪,因为在我输入大约
6
个数字的时候,调用realloc
是没有问题的,但是多于6
个数字就会出现问题了。最后仔细检查代码,发现
list = realloc(list, sizeof(int) * count);
中,count
指的不是数组的长度,而是读取数字的个数。因为数组的首位保存的是数字读取的个数,所以数组的总长度应该是读取数字的个数并且加一。我把代码换成
list = realloc(list, sizeof(int) * (count + 1));
就成功执行了。看来,我的问题是属于上面问题分析中的第二种问题。
至于为什么在输入小于
6
个数字的时候没有报错,估计是因为我虽然越界读取,但没有破坏到其他资源,所以没有出错吧。推荐阅读
- 解决SyntaxError:|解决SyntaxError: invalid syntax
- mac升级之(xcrun:|mac升级之:xcrun: error: invalid active developer path, missing xcrun)
- 遍历响应者
- RpcException:|RpcException: Invalid token! Failed to invoke method
- 解决vue项目中的“Invalid|解决vue项目中的“Invalid Host header”
- 深入学习SSR|深入学习SSR , NextJS 一起重构 掘金!
- iOS|iOS -- crash
- 729uva海明距离问题
- ant|ant design pro 轮播图加prev()和next()
- Mac 本升级系统后Git出现xcrun: error: invalid active developer path的问题