(1)代码测试:
#include <unistd.h>
int add(int a,int b)
{
return a+b;
}
int a1 =1;//全局栈区
static int a2 =2;//全局栈区
const int a3 =3;//代码区
main()//main函数地址,代码区
{
int b1 =4;//局部栈区
static b2 = 5;//全局栈区
const b3 = 6;//局部栈区
int *p1 = malloc(4);//p1:堆区
printf("%d\n",getpid());
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("main:%p\n",main);
printf("add:%p\n",add);
printf("p1:%p\n",p1);
while(1);
}
//打印输出结果:
a1:0x80497e4
a2:0x80497e8
a3:0x80485f4
b1:0xbfd15148
b2:0x80497ec
b3:0xbfd15144
main:0x8048432
add:0x8048424
p1:0x874d008
cd /proc
pa aue //查看所有的用户可执行进程
cd 3647
ls -l exe
ls -l cwd
cat maps
ladd main(可执行文件名称)
(2)内存管理1:依次是:
[root@kuenking 3647]# cat maps
00580000-00581000 r-xp 00000000 00:00 0 [vdso]
00701000-0071f000 r-xp 00000000 fd:00 1326103 /lib/ld-2.12.so
0071f000-00720000 r--p 0001d000 fd:00 1326103 /lib/ld-2.12.so
00720000-00721000 rw-p 0001e000 fd:00 1326103 /lib/ld-2.12.so
00727000-008b3000 r-xp 00000000 fd:00 1326114 /lib/libc-2.12.so
008b3000-008b5000 r--p 0018c000 fd:00 1326114 /lib/libc-2.12.so
008b5000-008b6000 rw-p 0018e000 fd:00 1326114 /lib/libc-2.12.so
008b6000-008b9000 rw-p 00000000 00:00 0
08048000-08049000 r-xp 00000000 fd:00 261916 /root/桌面/test 代码区
08049000-0804a000 rw-p 00000000 fd:00 261916 /root/桌面/test 全局栈区
0874d000-0876e000 rw-p 00000000 00:00 0 [heap]
b7777000-b7778000 rw-p 00000000 00:00 0
b778d000-b778f000 rw-p 00000000 00:00 0
bfd01000-bfd16000 rw-p 00000000 00:00 0 [stack]
1:代码区: 红色;
2:全局栈区:蓝色;
3:堆: 绿色;
4:局部栈区:黄色;
/关于理解malloc 的工作原理:
1;malloc 使用的是一个数据结构(链接),维护分配空间
链表的构成:分配的空间/上一个空间数据/下一个数据空间/空间的大小等信息
对malloc分配的空间不要越界访问,因为容易导致malloc /realloc/calloc/free /等释放就会可能造成程序出问题了。(奔溃)。
///CPP的new 和malloc的关系
malloc new new[]
realloc new() 定位分配
eg:定位分配
char p[20];
int *p = new(p)int;
定位分配意思是:对于已有的分配空间,如果不够,可以重新分配,首先释放之前已经分配的空间,然后重新分配空间大小;
calloc new[] 就是数组分配
free delete delete[]
1。new 的实现使用的是malloc来实现的,
区别:new的使用malloc后,还要初始化空间,基本类型,直接初始化默认值UDT类型,调用指定的构造器!
2.delete 调用free实现,delete 负责调用析构器,然后再调用free。
3、new 和new[]
new只调用一次构造器初始化,new[]则调用的是多次,循环对每个区域调用构造器。
4.delete 和delete[]
delete 和delete[]都会析构 ,释放首地址,但是delete[]会知道知道释放类似int *p = new int[20]; delete[],会自动知道释放后面的20个;
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
@@ @@ @@@@
@@ @@
变量类型 | 声明的位置 | 是否存于堆栈 | 作用域 | 如果声明static |
全局 | 所在代码之外 | 否 | 从声明到文件 尾 | 不允许从其他源文件访问 |
局部 | 代码块起始处 | 是 | 整个代码块 | 变量不存储与堆栈中,他的值在程序整个执行期一直保持 |
形式参数 | 函数头部 | 是 | 整个函数 | 不允许 |