一段代码的分析
程序员文章站
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申请的空间非常大。
最后这个代码给了我们什么样的启示呢?就是我们平时编程定义数组时要合理定义数组大小,避免占用内存资源过大,指针申请空间同样如此。
下一篇: 一段伪代码引发的多线程的思考