欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一段代码的分析

程序员文章站 2022-07-15 15:22:58
...

代码如下:

#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上运行结果:

[email protected]:~/桌面/task/code$ gcc -o l locate.c
[email protected]:~/桌面/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申请的空间非常大。
最后这个代码给了我们什么样的启示呢?就是我们平时编程定义数组时要合理定义数组大小,避免占用内存资源过大,指针申请空间同样如此。