locate.c详细解析

    xiaoxiao2024-11-25  95

    #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);将造成堆溢出

    最新回复(0)