locate.c详细解析

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值