代码功能
程序向我们展示了函数调用时函数和数据在内存中是怎样存放的。
内存分布
全局数据区域
存放全局变量,常量。
例如
show_pointer((void *) big_array, "big array");//big array是全局变量
代码区域
静态成员函数和非静态成员函数都是在类的定义时放在代码区域。
例如
show_pointer((void *) malloc, "malloc");//malloc放在代码区域
栈
存放局部变量,参数,返回值和返回地址。
例如
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);
}
show_pointer((void *) &global, "global");//放在栈中
堆
除去全局数据区域,代码区域,栈所拥有的空间,剩下的是空间是堆的。
代码块
#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;
}