一份代码可以知道具体方式和原理:
int main()
{
int stack_a;
int stack_b;
static int static_c;
static int static_d;
int *heap_e;
int *heap_f;
heap_e = (int *)malloc(10);
heap_f = (int *)malloc(10);
printf("The a address is %p\n",&stack_a);
printf("The b address is %p\n",&stack_b);
printf("The c address is %p\n",&static_c);
printf("The d address is %p\n",&static_d);
printf("The e address is %p\n",heap_e);
printf("The f address is %p\n",heap_f);
return 0;
}
输出log
root@ubuntu:/home/watson/test# ./a.out
The a address is 0x7ffd2d5894f0
The b address is 0x7ffd2d5894f4
The c address is 0x60104c
The d address is 0x601050
The e address is 0x23db010
The f address is 0x23db030
分析:
1. ab都是堆栈中的栈内存申请,因int占用四个字节,故f0 -> f4。
2. cd都是静态存储变量申请内存,在编译时已经申请分配好,不释放。
3. ef都是动态申请内存,属于堆栈的堆内存申请,此处返回一个指针。
情况1
heap\_e = (int \*)malloc(20); heap\_f = (int \*)malloc(20);
malloc (10) -> 10bytes内存申请
The e address is 0xc04010
The f address is 0xc04030
|--------------------|…..|--------------------|0xc04010
0xc04030
中间0x20 = 32bytes,由于字节对齐,申请时需要申请20bytes,系统对malloc管理是让其在32bytes后再开辟新的内存空间。
情况2
heap_e = (int *)malloc(30);
heap_f = (int *)malloc(30);malloc (10) -> 10bytes内存申请
The e address is 0xc04010
The f address is 0xc04040
|------------------------------|…..|------------------------------|0xc04010
0xc04040
中间0x30 = 48bytes,由于字节对齐,申请时需要申请30bytes,系统对malloc管理是让其在48bytes后再开辟新的内存空间。
修改如下的程序:
printf("The e address is %p\\n",heap\_e);
printf("The e+1 address is %p\\n",heap\_e + 1);
printf("The f address is %p\\n",heap\_f);
printf("The f-1 address is %p\\n",heap\_f - 1);
The e address is 0x12fa010
The e+1 address is 0x12fa014
The f address is 0x12fa030
The f-1 address is 0x12fa02c
0x12fa014
0x12fa02c
前后内存地址不一致,malloc多次内存是不会连续的。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章