针对linux课本的一个程序,反映出来的问题(留有问题没解决)

下面的代码是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;
}

 

代码已经大概注释过了,里面留有两个问题没有解决,等把内存管理机制这块弄完,再来解决这块吧,最近事多的很。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值