#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>//unistd是unix std的意思,是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,如exit函数等
static void show_pointer(void *p, char *descr)//该函数存储在静态存储区,函数名为show_pointer,入口参数为空类型指针p和char型指针descr,无返回值
{
// printf("Pointer for %s at %p\n", descr, p);
printf("%s\t%p\t%lu\n", descr, p, (unsigned long) p);//以字符串的形式打印descr,以地址形式打印p,以无符号长整型形式打印p
}
char big_array[1L<<24]; /* 16 MB *///定义了一个16MB大小的字符型数组big_array,1L<<24表示将1左移24位,即2的24次方
//char huge_array[1L<<31]; /* 2 GB */
char huge_array[1L<<30]; /* 1 GB *///定义了一个1GB大小的字符型数组huge_array
int global = 0;//定义一个整型的全局变量global,并赋值为0
int useless() { return 0; }//声明并定义一个函数useless,无入口参数,返回值类型为整型,功能就是返回0
int main ()//声明并定义主函数main,返回值类型为整型
{
void *p1, *p2, *p3, *p4;//定义四个空类型指针p1,p2,p3,p4
int local = 0;//定义一个局部变量local,并赋值为0
p1 = malloc(1L << 28);//用malloc函数申请2的28次方字节的空间,并将其首地址赋值给P1
p2 = malloc(1L << 8);//用malloc函数申请2的8次方字节的空间,并将其首地址赋值给P2
//p3 = malloc(1L << 32);
p3 = malloc(1L << 16);//用malloc函数申请2的16次方字节的空间,并将其首地址赋值给P3
p4 = malloc(1L << 8);//用malloc函数申请2的8次方字节的空间,并将其首地址赋值给P4
show_pointer((void *) big_array, "big array");//调用show_pointer函数,打印出数组big_array的存放地址,以及地址的无符号长整型形式
show_pointer((void *) huge_array, "huge array");
show_pointer((void *) &local, "local");//调用show_pointer函数,打印出局部变量local存放地址,以及地址的无符号长整型形式
show_pointer((void *) &global, "global");//调用show_pointer函数,打印出全局变量global的存放地址,以及地址的无符号长整型形式
show_pointer((void *) p1, "p1");//调用show_pointer函数,以地址形式打印出指针p1,以及地址的无符号长整型形式
show_pointer((void *) p2, "p2");
show_pointer((void *) p3, "p3");
show_pointer((void *) p4, "p4");
show_pointer((void *) useless, "useless");//调用show_pointer函数,打印出函数useless的存放地址,以及地址的无符号长整型形式
show_pointer((void *) exit, "exit");
show_pointer((void *) malloc, "malloc");//调用show_pointer函数,打印出函数malloc的存放地址,以及地址的无符号长整型形式
return 0;
}
#locate程序为我们展现了各种数据在内存中的存放位置。全局变量数组big_array,huge_array和全局变量global放在数据区;局部变量local放在栈中;由malloc函数得到的指针p1,p2,p3,p4放在堆中;函数useless,exit,malloc放在代码区。内存中代码区、数据区、堆、栈的地址由低到高变化。
#运行结果如下
#若将数组huge_array的声明改成char huge_array[1L<<31]; 将造成数据区溢出
#若将p3的赋值语句改为p3 = malloc(1L << 32);将造成堆溢出