先看一下测试代码:
#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就用这个区域。