csapp学习笔记(变量在内存中的位置)
程序员文章站
2022-05-11 17:58:55
...
先贴原理图,变量在内存中的分配如下图
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;
}
/*
aaa@qq.com:/mnt/hgfs/share/csapp_code$ gcc locate.c
aaa@qq.com:/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,这与原理图是相符合的。