首页 > 系统服务 > 详细

Linux C申请内存三种基本方式

时间:2021-03-29 15:37:58      阅读:20      评论:0      收藏:0      [点我收藏+]

一份代码可以知道具体方式和原理:

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多次内存是不会连续的。



Linux C申请内存三种基本方式

原文:https://www.cnblogs.com/real-watson/p/14592268.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!