`
isiqi
  • 浏览: 16367204 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

2-16 malloc(1)

阅读更多

动态分配内存
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字节填充。

分享到:
评论

相关推荐

    buddy_malloc.zip

    如果一个块的大小为2^n,那么它的伙伴的大小就是2^(n-1)。 3. **分配策略**:当请求一块大小为m的内存时,buddy malloc会找到第一个足够大的2^n阶块。如果n &gt; log2(m),则将该块分裂成两个伙伴块,将其中适合m的...

    Malloc tutorial.pdf

    #### 1. 引言 在C编程语言中,`malloc`是一个极为重要的函数,它用于在程序运行时动态分配内存。尽管许多程序员熟悉`malloc`的基本用法,但对其内部实现机制却知之甚少。本文档旨在通过编写一个简单的`malloc`函数...

    C语言入门Test-7-16.rar

    11. **内存管理**:最后,第16章可能会深入讨论动态内存分配(malloc, free)和内存泄漏问题,这是高级C编程中必须掌握的重要概念。 这个压缩包中的"Test-7-16"文件可能是包含了针对以上知识点的练习题目、代码示例...

    cpp-16年C语言培训

    1. **基础语法**:这是所有编程语言学习的起点,包括变量、数据类型(如整型、浮点型、字符型)、运算符、流程控制(如条件语句if-else,循环for、while、do-while)以及函数的定义与调用。 2. **指针**:C语言的...

    pcf8563_i2c1_r8_ruoge_ov2640通过给RTC驱动增加设备节点读取秒钟成功+直接读取I2C1获取秒钟值20160626_2201.7z

    lrwxrwxrwx root root 1970-01-02 08:31 i2c-1 -&gt; ../../devices/platform/sun5i-i2c.1/i2c-1 lrwxrwxrwx root root 1970-01-02 08:31 i2c-2 -&gt; ../../devices/platform/sun5i-i2c.2/i2c-2 root@android:/sys/class/...

    malloc内存泄漏

    1. **确保每次`malloc`或`new`操作都有相应的`free`或`delete`操作**:这是最基本的预防措施。 2. **使用智能指针**:在C++中,可以使用如`std::unique_ptr`或`std::shared_ptr`这样的智能指针来自动管理内存的生命...

    C/C++语言UTF16和UTF32互相转换生成文件

    if (converted == (size_t)-1) { // 错误处理 printf("转换失败\n"); } else { // 添加结束标志 utf32_str[converted] = L'\0'; // 打印或处理转换后的UTF-32字符串 ... } // 释放内存 free(utf32_str)...

    嵌入式系统开发人员C语言测试题-内存管理.doc

    1. **动态内存分配**: - `(char *)malloc(0)` 分配0字节的内存,根据C标准,`malloc(0)`可能返回NULL也可能返回非NULL的内存地址,但实际大小可能为0或系统最小分配单位。 - `malloc()`函数用于动态分配内存,...

    C语言程序设计11-16.zip

    《C语言程序设计11-16.zip》是针对武汉科技大学计算机考研801科目的真题及答案集合。这个压缩包包含从2011年至2016年历年试题,以及部分年的答案,是备考者的重要参考资料。以下是根据这些文件详细解析的C语言程序...

    Microchip单片机使用malloc()函数的注意事项

    另外,这里的“大”空间要大到heap空间输入值的1/2。以上面的16384为例,如果程序一跑上来请求分配小于8192的空间,就不会有“预热身”的需要。 在使用malloc()函数时需要注意以下几点: * 需要告知编译器程序中将...

    grub4dos-V0.4.6a-2017-02-04更新

    类型: 位0:高亮指定颜色 位1:高亮颜色翻转 位2:高亮显示线框 位7:背景透明(最好使用黑色背景) 文件名: *n.??? 格式 n=00-99 高亮颜色由 color HIGHLIGHT=0xrrggbb 指定。 字符可以使用任意字型、字高、...

    编译qt-everywhere-opensource-src-4.8.0-tp

    1. **解压 EABI-4.3.3_V0.1.tar.bz2 文件** 使用以下命令来解压所需的交叉编译器包。 ``` tar xvfj EABI-4.3.3_V0.1.tar.bz2 -C / ``` 2. **配置交叉编译器** 配置交叉编译器涉及到配置文件的修改以及环境...

    STM32F103C8T6基于SPI通信TF卡连接并加载FATFS文件系统的调试成功的程序

    基于STM32CubeMX创建 参考ST 官网例程 STM32F103RB-Nucleo下的演示程序Adafruit_LCD_1_8_...f_mout挂载成功, f_open一直不成功, 后面看到大神的帖子,说了要扩容 heap, malloc FatFs啥的, 就依葫芦画瓢, 果真调试成功了.

    [38]-16 C语言里变量的生命周期.pdf

    char* str = (char*)malloc(10 * sizeof(char)); str[0] = 'H'; str[1] = 'e'; str[2] = 'l'; str[3] = 'l'; str[4] = 'o'; str[5] = '\0'; return str; } int main() { char* s = get_string(); ...

    CC++面试问题分类大汇总.docx

    - 16位机:2字节 - 32位机:4字节 - 64位机:8字节 8. **引用全局变量的方式** - 使用`extern`关键字。 - 通过包含头文件。 9. **全局变量在头文件中的声明** - 可以在头文件中声明全局变量,但为了避免命名...

    数据结构考研真题(09-12)

    因此,前5层共有\(2^0 + 2^1 + 2^2 + 2^3 + 2^4 = 1 + 2 + 4 + 8 + 16 = 31\)个结点,加上第6层的8个结点,总共有39个结点。然而,由于这是一棵完全二叉树,最后一层可能还有其他结点,所以结点总数应该大于39。选项...

    16进制-二进制—十进制转换

    2 * 16^1 + D * 16^0 = 32 + 13 = 45 **从十六进制到二进制**: 先将十六进制转换为十进制,然后再转换为二进制。 例如,十六进制数2D转换为二进制: 2D(10进制)= 1101(二进制) **从二进制到十六进制**: 将...

    c语言函数大全 整理的一些 初级学者

    1. 输入/输出函数: - `printf()`:用于向标准输出(通常是显示器)打印格式化的数据。例如,`printf("Hello, World!\n");`。 - `scanf()`:用于从标准输入(通常是键盘)读取格式化的数据。例如,`scanf("%d", &...

Global site tag (gtag.js) - Google Analytics