C语言使用指针报错:munmap_chunk(): invalid pointer

看着《C语言入门经典(第5版)》学习C语言,学习动态内存时,用到了malloc(),calloc(),realloc(),free(),也写了一些代码。动态分配内存后,计算机做了什么?就是在内存中划出一块连续空间,比如

int *pNumber=(int*)malloc(100);

就是分配了100个字节的内存,也就是25个int长度。这个内存块的地址,也就是第1个字节的地址,由malloc()函数返回并赋予了pNumber。

而函数calloc()呢,比如

int *pNumber=(int*)calloc(25,sizeof(int));

就是划出一个内存数组,此数组长度为25,每一个元素的字节数是int类型长度,并将这个内存块的地址,也就是第1个字节地址给了pNumber。

这两种方法,pNumber+1都是指向第二个int,这不难理解,因为指针是int类型,所以pNumber+1指向下一个int,很合理。

PS:C语言中,形如数组的结构保存数据,“第1个”元素的地址和整个数据的地址是一致的。这是不是一个约定俗成的可信赖的规律?恳请明白的同学在评论区予以解答。

不必再展示realloc()了,问题重点不在那里。

思考,分配的内存,它的地址,同时也是第1个元素的地址,这样会混乱吗?比如以下情况:

1.我要释放了这一整块内存,直接free(pNumber),没什么异议;

2.我要释放了第2个元素,free(pNumber+1),会如何呢?无非两个结果:

    (1)成功。就是说,我可以释放了第2个元素,那么,释放第1个元素的操作是不是          free(pNumber)?这不就和情况1混乱了?

    (2)失败。可以推断,就不存在所谓“释放某个元素内存”这个操作,只有情况1释放申请的一整块内存这个操作。

事实是失败了,报了错误

munmap_chunk(): invalid pointer

因此,目前可猜测到的最好的原因是,C语言的free()方法,只能释放申请的一整块动态内存,不存在所谓“释放某个元素内存”这个操作。我在书上没找到这个的详述(也有可能我读书不够仔细),哪位同学明白真正的原因,或许更深入的见解,恳请评论解答。

参考书目:《C语言入门经典(第5版)》/(美)Horton,I 著;杨浩 译.清华大学出版社  2015年11月第5次印刷 ISBN 978-7-302-34341-7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值