malloc free 深入学习

来源:互联网 发布:西数 mac ntfs 插件 编辑:程序博客网 时间:2024/06/14 19:15
#include <stdio.h>#include <stdlib.h>int main(){    int * iptr = (int *)malloc(10 * sizeof(int));    for(int i = 0; i < 10; ++i){        iptr[i] = i * 1000;    }    printf("%p\n",iptr);    iptr = iptr + 3;    printf("%p\n",iptr);    free(iptr);    return 0;}

上面的代码在LINUX下运行会出错,因为free(iptr),Linux下,用malloc等函数在堆上申请一块内存,系统实际标记的,是大于所申请的内存大小,但我们能使用的,还是所申请的大小。堆管理程序会分配内存块,并将这块内存前4个或8个字节,用以记录本次申请的内存大小,如下图


malloc返回指向绿色区域的指针,这就是我们所申请的n个字节的内存块,实际上,在这块内存的前面4个或8个字节,记录着分配的内存的大小,(>所申请的内存字节),所以,在调用free函数的时候,它会读取前面4个或8个字节。上面的程序,改变了指针的指向,它前面的4个或8个字节,变成了被赋值的数据,在调用free的时候,会将前面的某个数据做为记录的内存块大小去释放,所以会出错。但是在widnows下不会出错,可能是因为内存管理机制不同吧。

原创粉丝点击