csapp学习笔记(变量在内存中的位置)

本文通过原理图和示例程序详细阐述了变量在内存中的分布:栈段存放局部变量,data段用于初始化非0全局和静态局部变量,bss段用于未初始化或初始化为0的全局变量,text段仅存放代码,heap区域则由malloc和free管理。通过实例,证实了局部变量地址高于全局变量的内存布局原则。

先贴原理图,变量在内存中的分配如下图
在这里插入图片描述
stack段:局部变量存放区域。函数中的局部变量都是存放在栈中

data段:初始化为非0全局变量和初始化为非0静态局部变量(static)

bss段:(未初始化或者初始化为0的) 全局变量和静态局部变量

text段:存放代码,only read

heap:自己申请的内存区域(malloc和free)

下面是例程,这个例程能很清晰地看到各种变量在内存中储存位置,来方便我们与上面地原理相印证

#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];    /* L指长整形, 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;
}

/*
gec@ubuntu:/mnt/hgfs/share/csapp_code$ gcc locate.c
gec@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out
右边的是将十六进制的地址转换为十进制,方便读者比较地址大小
big array	0x4804a060	1208262752
huge array	0x804a060	134520928
local	0xbfcc9fdc	3217858524
global	0x804a044	134520900
p1	0xa7545008	2807320584
p2	0x49a67008	1235644424
p3	0x49a67110	1235644688
p4	0x49a77118	1235710232
useless	0x80484b6	134513846
exit	0x8048370	134513520
malloc	0x8048350	134513488

*/

随便举个例子,局部变量p1到p4的地址都远大于全局变量big array,这与原理图是相符合的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值