大话C语言:第28篇 内存分配与释放

1 malloc函数

函数说明:

#include <stdlib.h>

void *malloc(size_t size);
功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。
	分配的内存空间内容不确定。
参数:
	size:需要分配内存大小(单位:字节)
返回值:
    成功:分配空间的起始地址
    失败:NULL

代码示例:

#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    // 使用 malloc() 分配内存来存储 5 个整数  
    int *array = (int *)malloc(5 * sizeof(int));  
      
    // 检查 malloc() 是否成功分配了内存  
    if (array == NULL) {  
        printf("内存分配失败\n");  
        return -1; // 返回非零值表示错误  
    }  
  
    // 初始化分配的内存中的整数  
    for (int i = 0; i < 5; i++) 
    {  
        array[i] = i + 1;  
    }  
  
    // 打印整数的值  
    printf("数组中各元素分别是:\n");  
    for (int i = 0; i < 5; i++) 
    {  
        printf("%d ", array[i]);  
    }  
    printf("\n");  
  
    // 释放分配的内存  
    free(array);  
  
    // 尝试访问已释放的内存可能会导致问题,所以不再使用 array 指针  
    // 将指针设置为 NULL 以避免悬挂指针 
    array = NULL;  
  
    return 0;  
}

2 calloc函数

函数说明:

#include <stdlib.h>

void *calloc(size_t num, size_t size);
功能:该函数与malloc()类似,但它还需要一个额外的参数来表示要分配的元素数量。它会返回一个指向已初始化为零的内存块的指针。
参数:
    num指定要分配的元素数量。
    size指定每个元素的大小。
返回值:
    成功:分配的内存块的指针
    失败:NULL

代码示例:

#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    // 使用 calloc() 分配内存来存储 10 个整数,并初始化为 0  
    int *array = (int *)calloc(10, sizeof(int));  
      
    // 检查 calloc() 是否成功分配了内存  
    if (array == NULL) 
    {  
        printf("内存分配失败\n");  
        
        return -1; 
    }  
  
    // 给数组中的每个元素赋一个值  
    for (int i = 0; i < 10; i++) 
    {  
        array[i] = i * 2; 
    }  
  
    // 打印数组中的值  
    printf("数组各个元素值分别是:\n");  
    for (i = 0; i < 10; i++)
    {  
        printf("%d ", array[i]);  
    }  
    printf("\n");  
  
    // 释放分配的内存  
    free(array);  
  
    // 将指针设置为 NULL,避免悬挂指针  
    array = NULL;  
  
    return 0;  
}

3 realloc()函数

函数说明:

#include <stdlib.h>

void *realloc(void *ptr, size_t new_size);
功能:用于调整之前分配的内存块的大小。如果调整成功,它会返回指向新内存块的指针;如果失败,它会返回NULL。
参数:
    ptr:指向一个之前由malloc(), calloc(), 或 realloc() 函数分配的内存块的指针。如果 ptr 是 NULL,那么 realloc() 的行为就如同 malloc(),分配一块大小为 new_size 的新内存。
    new_size:重新分配的内存块的大小,以字节为单位。
返回值:
	如果内存重新分配成功,realloc() 返回指向新内存块的指针。这个指针可能与 ptr 相同(如果重新分配发生在原地),也可能不同(如果内存块移动了位置)。
	如果内存重新分配失败,realloc() 返回 NULL,并且原内存块 ptr 保持不变(不会被自动释放)。    

代码示例:

#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    int *array = (int *)malloc(5 * sizeof(int));  
    if (array == NULL) {  
        perror("Memory allocation failed");  
        return 1;  
    }  
  
    // 初始化数组  
    for (int i = 0; i < 5; i++) {  
        array[i] = i;  
    }  
  
    // 打印原始数组  
    printf("Original array:\n");  
    for (int i = 0; i < 5; i++) {  
        printf("%d ", array[i]);  
    }  
    printf("\n");  
  
    // 尝试将数组大小增加到10  
    int *new_array = (int *)realloc(array, 10 * sizeof(int));  
    if (new_array == NULL) {  
        printf("内存重新分配失败\n");  
        
        // 释放原始内存  
        free(array); 
        
        return 1;  
    }  
  
    // 更新指针  
    array = new_array;  
  
    // 初始化新分配的内存部分  
    for (int i = 5; i < 10; i++) 
    {  
        array[i] = i;  
    }  
  
    // 打印新数组  
    printf("扩展后的数组:\n");  
    for (int i = 0; i < 10; i++) 
    {  
        printf("%d ", array[i]);  
    }  
    printf("\n");  
  
    // 释放内存  
    free(array); 
    
    // 将指针设置为 NULL,避免悬挂指针  
    array = NULL; 
  
    return 0;  
}

4 free函数

函数说明:

#include <stdlib.h>
void free(void *ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。
	对同一内存空间多次释放会出错。
参数:
	ptr:需要释放空间的首地址,被释放区应是由malloc函数所分配的区域。
返回值:无

代码示例:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int n = 0;
    printf("请输入要申请数组的个数: ");
    scanf("%d", &n);

    // 堆区申请 n * sizeof(int) 空间,等价int arr[n]
    int *arr = (int *)malloc(n * sizeof(int));
    if (arr == NULL) 
    {
        printf("申请空间失败!\n");
        
        return -1;
    }

    for (int i = 0; i < n; i++)
    {
        // 给数组赋值
        arr[i] = i;
    }

    for (int i = 0; i < n; i++) 
    {
        // 输出数组每个元素的值
        printf("%d, ", *(arr+i));
    }
    
    // 释放堆区空间
    free(arr);
    
    // 将指针设置为 NULL,避免悬挂指针  
    array = NULL; 

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/775591.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

竹云实力入选《现代企业零信任网络建设应用指南报告》代表性厂商

2024年7月3日&#xff0c;国内网络安全媒体安全牛正式发布《现代企业零信任网络建设应用指南报告(2024版)》。竹云凭借在零信任领域创新性的产品方案和优异的市场表现&#xff0c;实力入选代表性厂商。 伴随着云计算、AI、大数据等技术的发展&#xff0c;远程办公、业务协同、…

遗漏知识点

什么是RAII&#xff1f; RAII是Resource Acquisition Is Initialization&#xff08;wiki上面翻译成 “资源获取就是初始化”&#xff09;的简称&#xff0c;是C语言的一种管理资源、避免泄漏的惯用法。利用的就是C构造的对象最终会被销毁的原则。RAII的做法是使用一个对象&am…

西门子PLC1200--与电脑S7通讯

硬件构成 PLC为西门子1211DCDCDC 电脑上位机用PYTHON编写 二者通讯用网线&#xff0c;通讯协议用S7 PLC上的数据 PLC上的数据是2个uint&#xff0c;在DB1&#xff0c;地址偏移分别是0和2 需要注意的是DB块要关闭优化的块访问&#xff0c;否则是没有偏移地址的 PLC中的数据内…

VCS+Vivado联合仿真BUG

场景&#xff1a; 在vcsvivado联合仿真过程中&#xff0c;对vivado导出的shell脚本修改&#xff0c;修改某些source文件路径&#xff0c;vcs编译时会报Permission Denied。 问题描述 对shell脚本修改如下&#xff1a; 修改仅为注释掉某一行&#xff0c;下面变为source文件新…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【20】认证服务04—SSO单点登录

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【20】认证服务04—SSO单点登录 xxl-sso多系统-单点登录单点登录流程原理图单点登录流程简单实现参考 xxl-sso https://gitee.com/xuxueli0323/xxl-sso xxl-sso是开源的一个单点登录框架 …

交换机基本原理

文章目录 前言一、交换机的转发行为二、交换机的转发原理1.MAC地址表2.交换机初始状态3.学习MAC地址4.ARP协议5.交换机转发数据帧6.目标主机回复 三、华为交换机基本命令1.VRP视图分层2.命令行补全3.命令行帮助4.配置设备名称5.命令等级6.用户界面7.配置console认证8.配置用户界…

Ubuntu系统复制文件到共享文件夹出错

1、问题描述 Ubuntu系统复制文件到共享文件夹时&#xff0c;出现拼接文件时出错&#xff1a;输入/输出错误。 使用cp命令&#xff1a; cp -Rf XXX YYY 也是出错&#xff1a; cp: 写入 xxx 出错: 输入/输出错误 2、查看磁盘空间 查看磁盘空间&#xff0c;显示空间还有剩余…

Day05-组织架构-角色管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…

第一次的pentest show总结

第一次的pentest show总结 前言 开始之前&#xff0c;我特别感谢TryHackMe(英)、HackTheBox(美)、zero-point security(英)、offsec(美)等平台&#xff0c;使我们能够通过网络以线上的方式学习与练习&#xff0c;打破传统线下各地区教育资源差异大的限制&#xff0c;对网络教…

探索Sui的面向对象模型和Move编程语言

Sui区块链作为一种新兴的一层协议&#xff08;L1&#xff09;&#xff0c;采用先进技术来解决常见的一层协议权衡问题。Cointelegraph Research详细剖析了这一区块链新秀。 Sui使用Move编程语言&#xff0c;该语言专注于资产表示和访问控制。本文探讨了Sui的对象中心数据存储模…

Python从0到100(三十七):数据提取的概念和数据分类

1. 爬虫中数据的分类 在爬虫开发过程中,我们会遇到多种类型的数据。了解这些数据的类型对于有效地提取和解析信息至关重要。 结构化数据 结构化数据是指具有固定格式和模式的数据,常见的结构化数据格式包括JSON和XML。 处理方式:可以直接转换为Python的字典或列表等数据类…

【UML用户指南】-27-对体系结构建模-制品

目录 1、组成结构 2、制品的种类 2.1、部署制品 &#xff08;deployment artifact&#xff09; 2.2、工作产品制品 &#xff08;work product artifact&#xff09; 2.3、执行制品 &#xff08;execution artifact&#xff09; 3、标准元素 4、常用建模技术 4.1、对可执…

Redis 7.x 系列【17】四种持久化策略

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示2.1 无持久化2.2 RDB2.3 AOF2.4 混合模式2.4.1 方式一&#xff1a;…

LLM - 神经网络的组成

1. 一个神经元的结构&#xff1a;即接受多个输入X向量&#xff0c;在一个权重向量W和一个偏执标量b的作用下&#xff0c;经过激活函数后&#xff0c;产生一个输出。 2. 一层神经网络的结构&#xff1a;该层网络里的每个神经元并行计算&#xff0c;得到各自的输出;计算方式是输入…

CISAW证书考完有什么用?值得投资吗?

CISAW证书&#xff0c;在信息安全领域内被公认为具有高价值的一种职业资格认证&#xff0c;它象征着持有者在该领域的专业技能和知识水平。 因此&#xff0c;CISAW证书不仅具有实质性的价值&#xff0c;还能为持有者带来诸多益处。 首先&#xff0c;拥有CISAW证书的专业人士更…

简过网:教师编制报考要求和条件,都给你汇总好了!

如果你想要考教师编&#xff0c;那么在考试之前你先要明白这些知识&#xff01; ​ 一、什么是教师编&#xff1f; 在编教师拥有的编制为事业编&#xff0c;即在编老师为事业单位工作人员 二、考教师编需要什么条件&#xff1f; 1、普通话 语文学科普通话要求达到二级甲等及…

5.基于SpringBoot的SSMP整合案例-数据层开发

目录 1.新建项目 2.实体类开发&#xff1a; 2.1在pom.xml中增加Lombok坐标&#xff1a; 2.2添加Book实体类 3.数据层开发&#xff1a; 3.1 配置MyBatisPlus与Druid 3.2创建数据层接口 3.3写测试类 3.4点击运行&#xff1a; 4.数据层快速开发&#xff1a; 4.1配置MyB…

Camera link(学习笔记)

Camera Link协议是一种专门针对机器视觉应用领域的串行通信协议&#xff0c;它使用低压差分信号(LVDS)进行数据的传输和通信。Camera Link标准是在ChannelLink标准的基础上多加了6对差分信号线&#xff0c;其中4对用于并行传输相机控制信号&#xff0c;另外2对用于相机和图像采…

植物学(书籍学习资料)

包含观赏植物学、植物学、植物学百科图鉴等多本植物学方面的书籍学习资料。 图2、3为观赏植物学截图&#xff1b; 图4、5为植物学百科图鉴截图&#xff1b; 图6、7为植物学学习指南截图。

YOLO V7项目使用

YOLO V7项目使用 根据官方论文中提供的项目地址&#xff1a;使用git clone将项目下载到本地。 https://github.com/WongKinYiu/yolov7 git clone https://github.com/WongKinYiu/yolov7 使用pycharm打开项目&#xff0c;根据官方提供的requirement.txt文件下载项目启动所需要的…