C中内存堆栈的布局---linux 简单实例
来源:互联网 发布:淘宝app怎么看评价 编辑:程序博客网 时间:2024/05/22 14:42
http://blog.csdn.net/billvsme/article/details/18282897
一、linux 内存管理
1. 变量空间
linux 每运行一个程序都会在/proc内生成一个跟自己pid一样的文件夹,你面放着程序有关的信息
ldd ./1
可以看到
linux-vdso.so.1 (0x00007fff47eac000)
libc.so.6 => /lib64/libc.so.6 (0x00007f37c4414000)
/lib64/ld-linux-x86-64.so.2 (0x00007f37c47bc000)
/lib64/ld-linux-x86-64.so.2是一个可执行文件 用来生成 /proc/${pid}内的文件
- <span style="font-size:14px;">#include<stdio.h>
- #include<unistd.h>
- #include<malloc.h>
- int a1;
- static int a2=2;
- const int a3=2;
- int add(int a,int b)
- {
- return a+b;
- }
- int main()
- {
- int b1;
- static int b2=2;
- const int b3=2;
- int *p1;
- int *p2 = (int *)malloc(4);
- printf("a1 %p\n",&a1);
- printf("a2 %p\n",&a2);
- printf("a3 %p\n",&a3);
- printf("b1 %p\n",&b1);
- printf("b2 %p\n",&b2);
- printf("b3 %p\n",&b3);
- printf("p1 %p\n",p1);
- printf("p2 %p\n",p2);
- printf("main %p\n",main);
- printf("f %p\n",add);
- printf("%d\n",getpid());
- while(1);
- return 0;
- }</span><span style="font-size: 18px;">
- </span>
结果
a1 0x601060
a2 0x601048
a3 0x400828
b1 0x7fffaa41f41c
b2 0x60104c
b3 0x7fffaa41f418
p1 0x7fffaa41f510
p2 0xddd010
main 0x4005e8
f 0x4005d4
18155
cat /proc/18155/map 结果
00400000-00401000 r-xp 00000000 08:13 1845721 /codes/gj/1
00600000-00601000 r--p 00000000 08:13 1845721 /codes/gj/1
00601000-00602000 rw-p 00001000 08:13 1845721 /codes/gj/1
00ddd000-00dfe000 rw-p 00000000 00:00 0 [heap]
7f7916efa000-7f7917099000 r-xp 00000000 08:13 2883641 /lib64/libc-2.15.so
7f7917099000-7f7917298000 ---p 0019f000 08:13 2883641 /lib64/libc-2.15.so
7f7917298000-7f791729c000 r--p 0019e000 08:13 2883641 /lib64/libc-2.15.so
7f791729c000-7f791729e000 rw-p 001a2000 08:13 2883641 /lib64/libc-2.15.so
7f791729e000-7f79172a2000 rw-p 00000000 00:00 0
7f79172a2000-7f79172c3000 r-xp 00000000 08:13 2883719 /lib64/ld-2.15.so
7f7917490000-7f7917493000 rw-p 00000000 00:00 0
7f79174c1000-7f79174c3000 rw-p 00000000 00:00 0
7f79174c3000-7f79174c4000 r--p 00021000 08:13 2883719 /lib64/ld-2.15.so
7f79174c4000-7f79174c5000 rw-p 00022000 08:13 2883719 /lib64/ld-2.15.so
7f79174c5000-7f79174c6000 rw-p 00000000 00:00 0
7fffaa400000-7fffaa421000 rw-p 00000000 00:00 0 [stack]
7fffaa444000-7fffaa445000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
可以知道 全局的 普通变量、静态变量放在 全局栈中,全局 const变量 放在 代码区 。
局部普通变量 和const变量都放在局部栈中,static变量放在 全局栈中。malloc申请的空间放在 堆中。
main函数 和 自己写的函数 都是放在 代码区的。
2.malloc 申请的内存
- <span style="font-size:14px;">#include<stdio.h>
- #include<unistd.h>
- #include <malloc.h>
- int main(int argc, const char *argv[])
- {
- int a1 = 10;
- int a2 = 10;
- int a3 = 10;
- int *p1 = (int*)malloc(4);
- int *p2 = (int*)malloc(4);
- int *p3 = (int*)malloc(4);
- printf("a1 %p\n",&a1);
- printf("a2 %p\n",&a2);
- printf("a3 %p\n",&a3);
- printf("p1 %p\n",p1);
- printf("p2 %p\n",p2);
- printf("p3 %p\n",p3);
- printf("%d\n",getpid());
- while(1);
- return 0;
- }
- 结果:
- a1 0x7fff4445f7a4
- a2 0x7fff4445f7a0
- a3 0x7fff4445f79c
- p1 0x1dcb010
- p2 0x1dcb030
- p3 0x1dcb050
- 18323</span>
1. 普通变量是在栈中的,它的地址是 越早分配的地址越小,malloc 创建的内存是在堆中的地址是按顺序分配下来的
2. malloc申请的变量不是申请4个字节就只占用4个直接,具体见后面。
3.malloc申请的内存结构
- <span style="font-size:14px;">#include<stdio.h>
- #include<malloc.h>
- int main(int argc, const char *argv[])
- {
- int *p1 = malloc(4);
- int *p2 = malloc(4);
- int *p3 = malloc(4);
- *p1 = 1;
- *(p1+1) = 2;
- *(p1+2) = 3;
- *(p1+3) = 4;
- *(p1+4) = 5;
- *(p1+5) = 6;
- *(p1+6) = 7;
- *(p1+7) = 8;
- *(p1+8) = 10;
- *(p1+9) = 11;
- //free(p1);
- printf("%d\n",*p2);
- return 0;
- }
- 结果:
- 10</span>
原因 堆是由链表管理的,malloc 生成的空间 , 先是本身的数据,再是前一个元素的地址,再是后一个元素的地址,再后一个是本身数据的长度。所以改变 p1+2 p1+3 的值会使 free 出错。
4.new delete跟 malloc free有什么区别
new就是靠malloc的 delete 就是靠free的,只是new 在生成是会初始化,delete在删除是会先清0。
其他知识点:
c语言是弱类型语言,c++是强类型语言
int *p = malloc(4);
在c是对的,在c++是错的,c++一定要(int*)malloc(4);
gcc xxx.cpp 是按照c++ 编译的
gcc xxx.c 才会按照c编译
- C中内存堆栈的布局---linux 简单实例
- linux中C程序的内存布局
- c语言中堆栈的简单理解
- 堆栈、linux c程序存储空间布局的总结
- C 语言堆栈的实例
- c的堆栈,内存分配
- C的堆栈,内存分配
- c的堆栈,内存分配
- C的堆栈,内存分配
- SWT堆栈式布局的简单使用
- 内存中堆栈的理解
- C的内存布局
- C语言中内存以及堆栈情况
- Linux 内存的布局
- Linux的内存布局
- C语言 数据结构 堆栈的压栈出栈实例
- C/C++的堆栈,内存分配(转)
- C/C++的堆栈,内存分配
- 3.求子数组的最大和(数组)
- ORACLE(SQL)使用小记
- HDU 1098
- linux命令ps aux|grep xxx详解
- poj 1363 Rails
- C中内存堆栈的布局---linux 简单实例
- 一个毕业五年的女程序员的工作经历上
- SecureCRT(Linux平台)中的一些实用/有趣用法
- Javascript URL 编码区别及转义字符处理
- 修改PATH导致进不去系统 解决方案
- Android从程序员到架构师之路-高焕堂
- Android中GC_EXTERNAL_ALLOC的含义小结
- 第十九章 调试——断点
- stringstream