C内存分布


先看一下测试代码:

#include <stdio.h>
#include <stdlib.h>

int g_val;
int g_ival = 5;

char *g_ptr;
char *g_iptr = "hongchunhua";

static int s_val;
static int s_ival = 5;

int print_add(int val)
{
	int a;
	int b = 1;
	static int c;
	
	char *p = NULL;
	p = (char *)malloc(1);
	
	printf("Address g_iptr=\t0x%x.\n", g_iptr);
	printf("Address print_add=\t0x%x.\n", &print_add);
	printf("Address g_ival=\t0x%x.\n", &g_ival);
	printf("Address g_iptr=\t0x%x.\n", &g_iptr);
	printf("Address s_ival=\t0x%x.\n", &s_ival);
	printf("Address g_val=\t0x%x.\n", &g_val);
	printf("Address g_ptr=\t0x%x.\n", &g_ptr);
	printf("Address s_val=\t0x%x.\n", &s_val);
	printf("Address c=\t0x%x.\n", &c);
	printf("Address p=\t0x%x.\n", &p);
	printf("Address val=\t0x%x.\n", &val);
	printf("Address a=\t0x%x.\n", &a);
	printf("Address b=\t0x%x.\n", &b);	
	
	free(p);
	p = NULL;
	return 0;
}

int main()
{
	return print_add(2);
}


输出结果:
Address g_iptr= 0x8048620.
Address print_add=      0x80483e4.
Address g_ival= 0x8049834.
Address g_iptr= 0x8049838.
Address s_ival= 0x804983c.
Address g_val=  0x8049850.
Address g_ptr=  0x8049854.
Address s_val=  0x804984c.
Address c=      0x8049848.
Address p=      0xbfb5d49c.
Address val=    0xbfb5d4b0.
Address a=      0xbfb5d4a4.
Address b=      0xbfb5d4a0.


大体上是从小到大输出,大体上我们知道0-3G为用户空间,剩下的1G为内核空间。

从小到大依次为

代码区 print_add 和 "hongchunhua"这个字符串。

全局已经初始化区 包括了g_ival, s_ival

全局未初始化区,包括了g_val, g_ptr, c,s_val

堆,就是p。

栈,包括了val,a和b。


其实在堆和栈中间还有一个区域,叫做映射区,mmap就用这个区域。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值