看着《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