当前位置: 首页 > 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

相关文章:

  • MyBatis动态SQL
  • go并发编程| channel入门
  • 2024 CKA模拟系统制作 | Step-By-Step | 15、查看Pod日志
  • ICECEPSS 2025:节能环保与社会治理的融合之道
  • 百度之星2024 初赛第一场 补给
  • 基于大模型的重度膝关节骨关节炎全流程预测与治疗方案研究
  • Elasticsearch集群管理的相关工具介绍
  • 晶振频率稳定性:5G 基站与航天设备的核心竞争力
  • 5G-A时代与p2p
  • linux创建虚拟网卡和配置多ip
  • Python进阶【四】:XML和JSON文件处理
  • Spring官方的在线教程也可以用中文观看了
  • pom.xml 文件中配置你项目中的外部 jar 包打包方式
  • Sentieon项目文章 | 社区努力识别和纠正蛋白质基因组研究中标签错误的样本
  • 用户隐私如何在Facebook的大数据中得到保护?
  • Windows 中禁止在桌面放置文件以保持桌面整洁
  • 如何全面了解支付宝生态帝国,有何启发?
  • 经典SQL查询问题的练习第一天
  • C语言中野指针问题
  • 前端面试题-HTML篇
  • 网站怎样做的有吸引力/百度知道合伙人官网登录入口
  • 有哪些可以做推广的网站/外贸网络推广怎么做
  • 莱芜都市网征婚交友/网络seo软件
  • 网站做微信接口吗/百度上传自己个人简介
  • 网站点击后的loading是怎么做的/网站浏览器
  • 恩施网站建设/百度百家号