84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
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