2-16 malloc(1)

来源:互联网 发布:乐视2用不了移动数据 编辑:程序博客网 时间:2024/06/04 18:26

动态分配内存
memory alloc malloc
1.malloc C库函数 内部封装了brk。
2.int brk(void *addr); linux;

结构:
app
库 lib
API
OS
hard


由于对齐,可能分配内存会取4的倍数
int *p;
p=malloc(4); 4字节
void free(void*ptr);//释放,和malloc对应  ptr为申请内存块的地址,不能知道执行成不成功。

#include<stdio.h>
#include<stdlib.h>
int main()
{
 int*p;
 char buf[32];
 p=(int*)malloc(sizeof(int));
 ...
 free(p);
 return 0;
}

free一定要释放heap的内存。

内存结构:
stack 局部变量 函数调用 自顶向下 10M
heap 自底向上 malloc分配的空间
bss 没有初始化的全局变量
data 全局变量
redata 常量
text 二进制

递归 stack smash(产生过多栈针)

当进程结束,动态分配才会还给系统。
free只是autorelease

当申请n个字节空间时,不只n个空间,前面有个管理结构(4字节)

malloc 8字节对齐
 1000   8
10000   16
11000   24
后三位都为0
所以得出4字节的管理机制的后三位为0
最后一位说明内存是否可用。0表示不可用 1表示可用

int main(int argc,char*argv[])
{
 int *p,*q;
 int n;
 n=atoi(argv[1]);  //string->int
 p=(int*)malloc(n);
 q=(int*)malloc(8);
 printf("%x,%d/n",p[-1],(unsigned)q-(unsigned)p);  //p[-1]为管理结构
 free(p);
 free(q);
}

如果分配16个字节,则需要分配20个字节,但是不能被8整除,所以4字节填充。
 

原创粉丝点击