84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
sample code:
int i = 3; int j; void f () { int x = 4; int *p = malloc (sizeof(*p)); }
where are i, j, f, x, and p located?
业精于勤,荒于嬉;行成于思,毁于随。
很显然,i和j做为全局变量,在程序的静态存储区;这块区域在程序启动时即被申请,同时在程序运行全程不被释放。
i
j
x和p作为局部变量,分配在调用栈上。随f()被调用时被分配,返回(退栈)时被释放。
x
p
f()
f作为一个函数,存储在内存的代码段。代码段的东西随程序启动时读入内存,并且在程序运行全程不动。
f
p指向的内存被分配在堆上。“堆”其实本质是系统动态分配给内存的空间——程序把从系统中动态申请下来的一段空间视为“堆”,并提供malloc()等灵活的分配功能。操作系统其实只知道一段内存被程序申请走,而根本不知道这段内存的使用模型是“堆”。
malloc()
f:.text segment,i:.data segment,j:.bss segment,x,p:stack,x和p都是局部变量,存于栈上,但是p指向的内存空间处于heap上。
i,j在静态区,x在栈区,p的内容在堆区
样品—>样品是->是
你看下下面两个文章,讲得很清楚的
ij在堆中xp在栈里
http://segmentfault.com/a/1190000002575242
http://m.blog.csdn.net/blog/zhoucoolqi/7540612
很显然,
i
和j
做为全局变量,在程序的静态存储区;这块区域在程序启动时即被申请,同时在程序运行全程不被释放。x
和p
作为局部变量,分配在调用栈上。随f()
被调用时被分配,返回(退栈)时被释放。f
作为一个函数,存储在内存的代码段。代码段的东西随程序启动时读入内存,并且在程序运行全程不动。p
指向的内存被分配在堆上。“堆”其实本质是系统动态分配给内存的空间——程序把从系统中动态申请下来的一段空间视为“堆”,并提供malloc()
等灵活的分配功能。操作系统其实只知道一段内存被程序申请走,而根本不知道这段内存的使用模型是“堆”。f:.text segment,
i:.data segment,
j:.bss segment,
x,p:stack,
x和p都是局部变量,存于栈上,但是p指向的内存空间处于heap上。
i,j在静态区,x在栈区,p的内容在堆区
样品—>样品是->是
你看下下面两个文章,讲得很清楚的
ij在堆中
xp在栈里
http://segmentfault.com/a/1190000002575242
http://m.blog.csdn.net/blog/zhoucoolqi/7540612