84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
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的内容在堆区
sampe—>sample is->are
你看下下面两个文章,讲得很清楚的
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的内容在堆区
sampe—>sample is->are
你看下下面两个文章,讲得很清楚的
ij在堆中
xp在栈里
http://segmentfault.com/a/1190000002575242
http://m.blog.csdn.net/blog/zhoucoolqi/7540612