下面的代码是linux课本上的一段代码,主要就是看一下,每一个进程分配的3G虚拟内存中的,不同区间是怎么存储的。
这些区间包含:
栈区间,堆区间,代码区,BSS区,数据区。
代码如下:
/*
*这段代码留了两个问题没有解决。
*
*
*
*
*/
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
int bss_var;
int data_var0 = 0;
int data_var1 = 1;
int data_var2 = 2;
int main(int argc, char **argv){
printf("below are addresses of types of process's mem\n");
//以下是打印代码区间的起始地址
//这块没有什么可以说的,就是代码段的地址,这里打印的是main函数的地址
printf("Text location:\n");
printf("\tAddress of main(Code Segment):%p\n", main);
printf("_________________________\n");
//以下是打印栈区间的起始地址
//栈里面存放的是局部变量
//这里注意两点,一、如果我连续定义几个变量,然后只在最后输出最后定义的那个变量
//的开始地址,那么其余定义了但是没有用的变量都不会在栈里,因为定义了变量,
//但是没有使用,所以在编译的时候它们并没有入栈。栈里只有最后定义的那个变量和
//第一个变量。二、当我将四个变量全部定义成同种类型的话,那么打印出来的地址会
//呈现规律递增,比如四个int型,那么地址之间就会相差四个字节,比如四个char型,
//地址之间就会相差1个字节,但是,当我把定义一个char型紧接着定义一个int型,那么
//不会像我想的那样,会先增长1个字节,然后增长四个字节,有时会出现不规律的变化。
//这个问题暂时还没有想明白,留做以后思考。
//先定义一个int型的stack_var0,然后打印其起始地址
int stack_var0 = 0;
printf("Stack Location:\n");
printf("\tInitial end of stack:%p\n", &stack_var0);
//然后定义一个int型的stack_var1,然后打印其起始地址
int stack_var1 = 1;
printf("\t1:New end of stack:%p\n", &stack_var1);
//然后定义一个int型的stack_var2,然后打印其起始地址
int stack_var2 = 2;
printf("\t2:New end of stack:%p\n", &stack_var2);
//然后定义一个int型的stack_var2,然后打印其起始地址
int stack_var3 = 3;
printf("\t3:New end of stack:%p\n", &stack_var3);
printf("__________________________\n");
//以下是打印数据区间的起始地址
//数据区间保存的是局部静态变量(由static修饰的变量)和全局变量(比如最开始定义的那几个)
printf("Data Location:\n");
printf("\tAddress of data_var(Data Segment):%p\n", &data_var0);
//这里我还是给的全部的int型,所以我在想,要是给穿插char型的话,因为char是1个字节,
//所以下面一个int型,并不会紧跟着上面开始,而是会从下一个4的倍数字节开始,所以,就是
//相当于是char后面有3个字节的空间什么也没有,然后下一个int才会接着这个地方开始。
//先这么想着,今天时间不够了,以后再验证。
static int data_var3 = 3;
printf("\tNew end of data_var(Data Segment):%p\n", &data_var3);
static int data_var4 = 4;
printf("\tNew end of data_var(Data Segment):%p\n", &data_var4);
static double data_var5 = 5;
printf("\tNew end of data_var(Data Segment):%p\n", &data_var5);
printf("__________________________\n");
//以下是打印BSS(Block Started by Symbol)区间的相关变量的地址
//BBS里面保存的是,定义了但是没有赋值的变量,比如在最开始的那个bss_var
printf("BSS Location:\n");
printf("\tAddress pf bss_var:%p\n", &bss_var);
char bss_var1;
printf("\tAddress pf bss_var:%p\n", &bss_var1);
printf("__________________________\n");
//以下是打印堆区间的地址
//堆就是申请空间的时候,从这里给分配空间的,比如malloc等函数申请空间的时候,就是从
//堆里分配出去的。
//但是,为什么一次会分出去那么多的空间,这是另一个问题。
char *b = sbrk((ptrdiff_t)0);
printf("Heap Location:\n");
printf("\tInitial end of heap:%p\n", b);
brk(b + 8);
b = sbrk((ptrdiff_t)0);
printf("\tNew end of heap:%p\n", b);
int *p = (int *)malloc(sizeof(int));
printf("\tNew end of heap:%p\n", p);
int *q = (int *)malloc(sizeof(int));
printf("\tNew end of heap:%p\n", q);
int *j = (int *)malloc(sizeof(int));
printf("\tNew end of heap:%p\n", j);
return 0;
}
代码已经大概注释过了,里面留有两个问题没有解决,等把内存管理机制这块弄完,再来解决这块吧,最近事多的很。