当前位置: 首页 > news >正文

C54-动态开辟内存空间

1.malloc

  • 原型void* malloc(size_t size);(位于 <stdlib.h> 头文件中)

  • 作用:分配一块连续的、未初始化的内存块,大小为 size 字节。

  • 返回值:

    • 成功:返回指向分配内存首地址的 void* 指针(需强制类型转换后才能使用)。
    • 失败(如内存不足):返回 NULL
  • 代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char *p;             // 1. 声明一个 char 类型的指针 pp=(char *)malloc(1); // 2. 动态分配 1 字节的内存,并将地址赋给 p*p= 'c';             // 3. 将字符 'c' 存储到 p 指向的内存中printf("%c\n",*p);p=(char *)malloc(12);strcpy(p,"Hello!");printf("%s",p);return 0;
}
  • 成果展示:image-20250529122947592

2.realloc

作用:调整动态内存块大小(扩大/缩小)。

原型

void *realloc(void *ptr, size_t new_size);
  • ptr:原内存指针。
  • new_size:新大小(字节)。若为 0ptr 非空,等同 free

关键点

  1. 可能移动内存:若原位置空间不足,会分配新内存并复制数据。

示例

int *arr = malloc(5 * sizeof(int));  
arr = realloc(arr, 10 * sizeof(int));  // 扩容到10个int
free(arr);
  • 代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char *p;             p=(char *)malloc(7);strcpy(p,"Hello!");printf("%s\n",p);printf("扩容前地址:%p\n",p);free(p); p=NULL;int len;len=strlen("若原位置空间不足,会分配新内存并复制数据");p=realloc(p,len+1);strcpy(p,"若原位置空间不足,会分配新内存并复制数据");printf("%s\n",p);printf("扩容后地址:%p\n",p);return 0;
}
  • 成果展示:

image-20250529160228308

3.free

作用:释放 malloc/calloc/realloc 分配的动态内存,防止内存泄漏。

用法

void free(void *ptr);  // ptr 必须是动态分配的内存地址

关键点

  1. 必须配对使用:每个 malloc 都要对应一个 free
  2. 避免悬空指针:释放后指针应置 NULLptr = NULL)。
  3. 禁止重复释放:对同一内存多次 free 会导致崩溃。
  4. 仅用于动态内存:静态数组(如 int a[10])不可 free

示例

int *p = malloc(10 * sizeof(int));  
if (p != NULL) {  // 使用内存...  free(p);  p = NULL; // 安全操作  
}

4.memset

功能

快速将某块内存的所有字节设为指定值(按字节填充)。

函数原型
void *memset(void *ptr, int value, size_t num);  
  • ptr:目标内存首地址(如数组、结构体)。
  • value:填充值(实际取低8位,范围0~255)。
  • num:填充的字节数(通常用 sizeof 计算)。
  • 返回值:返回 ptr 本身。

常用场景
  1. 清零内存(最安全):

    int arr[10];  
    memset(arr, 0, sizeof(arr)); // 所有字节置0  
    
  • 代码示例:
#include <stdio.h>
#include <string.h>int main()
{int arr[10]={1,2,3,4,};memset(arr,0,sizeof(arr));for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}
  • 成果展示:

image-20250529215753001

  1. 填充字符数组:

    char str[10];  
    memset(str, 'A', 5);  // 前5字节设为'A'(需手动补'\0')  
    
  • 代码示例:
#include <stdio.h>
#include <string.h>int main()
{char arr[10];memset(arr,'S',5);for(int i=0;i<10;i++){printf("%c ",arr[i]);}return 0;
}
  • 成果展示:

image-20250529220119589

http://www.xdnf.cn/news/705817.html

相关文章:

  • Java交互协议详解:深入探索通信机制
  • 【Linux笔记】Shell-脚本(下)|(常用命令详细版)
  • 基于随机函数链接神经网络(RVFL)的锂电池健康状态(SOH)预测
  • ICASSP2025丨融合语音停顿信息与语言模型的阿尔兹海默病检测
  • .NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台
  • 智能仓储落地:机器人如何通过自动化减少仓库操作失误?
  • 自动化中的伦理:驯服人工智能中的偏见与守护合规之路
  • Magentic-UI:人机协作的网页自动化革命
  • Mybatis中实现多表查询(多对一)
  • 【Hive 运维实战】一键管理 Hive 服务:Metastore 与 HiveServer2 控制脚本开发与实践
  • 上传图片转成3D VR效果 / 用photo-sphere-viewer实现图片VR效果
  • HTML、XML、JSON 是什么?有什么区别?又是做什么的?
  • 在 RedHat 系统(RHEL 7/8/9)中安装 ​​pythonnet​​ 和 ​​.NET Core​​ 的完整指南
  • 算法打卡第10天
  • Linux `cp` 命令深度解析与高阶应用指南
  • dify 配置访问前缀
  • WPF 按钮点击音效实现
  • 性能优化深度实践:突破vue应用性能
  • C# 打印PDF的常用方法
  • JS入门——JS引入方式
  • Qt Creator调用Python代码
  • 微信小程序(uniapp)实现腾讯云 IM 消息撤回
  • 本地部署消息代理软件 RabbitMQ 并实现外部访问( Windows 版本 )
  • stm32cube ide如何生成LL库工程
  • 云原生时代 Kafka 深度实践:02快速上手与环境搭建
  • 公司数据不泄露,DeepSeek R1本地化部署+web端访问+个人知识库搭建与使用
  • Git的三种合并方式
  • LVS+Keepalived 高可用群集
  • 第二章 1.7 数据采集安全风险防范之数据质量管理
  • 一文清晰理解目标检测指标计算