一段代码的分析

代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

static void show_pointer(void *p, char *descr) {
    //    printf("Pointer for %s at %p\n", descr, p);
    printf("%s\t%p\t%lu\n", descr, p, (unsigned long) p);
}

char big_array[1L<<24];    /                                                                                                                                                   *  16 MB */
//char huge_array[1L<<31];   /*   2 GB */
char huge_array[1L<<30];/*   1 GB */
int global = 0;
int useless() { return 0; }

int main ()
{
    void *p1, *p2, *p3, *p4;
    int local = 0;
    p1 = malloc(1L << 28);
    p2 = malloc(1L << 8);
    //p3 = malloc(1L << 32);
	p3 = malloc(1L << 16);
    p4 = malloc(1L << 8);

    show_pointer((void *) big_array, "big array");
    show_pointer((void *) huge_array, "huge array");
    show_pointer((void *) &local, "local");
    show_pointer((void *) &global, "global");
    show_pointer((void *) p1, "p1");
    show_pointer((void *) p2, "p2");
    show_pointer((void *) p3, "p3");
    show_pointer((void *) p4, "p4");
    show_pointer((void *) useless, "useless");
    show_pointer((void *) exit, "exit");
    show_pointer((void *) malloc, "malloc");
    return 0;
}

在Linux上运行结果:

hxl@hxl-virtual-machine:~/桌面/task/code$ gcc -o l locate.c
hxl@hxl-virtual-machine:~/桌面/task/code$ ./l
big array	0x56382f018040	94799306784832
huge array	0x5637ef018040	94798233043008
local	0x7ffc890a3054	140722607632468
global	0x5637ef018024	94798233042980
p1	0x7faba13f3010	140375121408016
p2	0x563830b80260	94799335522912
p3	0x563830b80370	94799335523184
p4	0x563830b90380	94799335588736
useless	0x5637eee1774d	94798230943565
exit	0x7fabb1437120	140375390122272
malloc	0x7fabb148b070	140375390466160

这个程序首先定义了2个char型数组,大小分别为16MB,1GB,后1个占用内存是非常大的,尤其对于数组这种申请连续空间的来说,更是占用内存资源过大,后面就写了个函数来显示数组以及其他一些变量的地址,还显示了地址转化成10进制的数,big array 的地址与huge array的地址之间相差是非常大的,这个差值就大致表示了big array 的占用大小,后面同样,指针p1申请了2的28次方的一个空间,p2申请了2的8次方的空间,p1的地址与p2的地址相差也是非常大的,这表示了p1申请的空间非常大。
最后这个代码给了我们什么样的启示呢?就是我们平时编程定义数组时要合理定义数组大小,避免占用内存资源过大,指针申请空间同样如此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值