cat maps
由于当进程存在时那个pid文件夹才存在,所以你需要写一个死循环保证程序一直在运行
#include <unistd.h> #include <stdio.h> int main() { printf("%d\n",getpid()); while(1){} }
导致malloc/free/callo/realloc不正常工作
这就是为什么连续使用 malloc 分配的首地址 之间的间隔不等于分配的空间大小的原因.
这就是为什么动态分配的空间, 越界修改后,会导致malloc/free/callo/realloc不正常工作的原因,
示例: 发现每个地址之间相差16. new的情况和这样一样
#include <stdio.h> #include <stdlib.h> int main() { int *p1 = (int *)malloc(4); int *p2 = (int *)malloc(8); int *p3 = (int *)malloc(16); int *p4 = (int *)malloc(8); int *p5 = (int *)malloc(8); int *p6 = (int *)malloc(4); int *p7 = (int *)malloc(4); printf("%p\n",p1); // %p输出地址, %x 输出16进制,后面只能是整形 printf("%p\n",p2); printf("%p\n",p3); printf("%p\n",p4); printf("%p\n",p5); printf("%p\n",p6); printf("%p\n",p7); /* 0x881b008 0x881b018 0x881b028 0x881b038 0x881b048 0x881b058 0x881b068 */ }
示例: 越界赋值后出现错误
#include <stdio.h> #include <stdlib.h> #include <unistd.h> main() { int* p1 =(int*)malloc(4); int* p2 =(int*)malloc(16); int* p3 =(int*)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; printf("*p2:%d\n",*p2); //5 //free(p1); // 会出严重问题 /* 堆的结构: 1 指向本空间的指针 2 指向上一个空间的指针 3 指向下一个空间的指针 4 本空间的大小 */ }这是因为修改了结构体里面的其它部分的值.
#include <stdio.h> #include <new> int main() { int a[20]; int *p = new(a) int; // 定位分配运算符 }