68.【C语言】动态内存管理(重点)(上)

news2024/12/23 14:02:30

本文为数据结构打下基础

备注:数据结构需要掌握指针,结构体和动态内存管理

目录

1.内存开辟的方式

2.malloc函数

cplusplus网翻译

提炼要点

操作内存空间

01.开辟内存空间成功

02.开辟内存空间失败

如果是x64+debug环境下,可能会成功


1.内存开辟的方式

01.创建变量

int a = 0;

一次性开辟一块空间(在这里为4字节)

02.创建数组

int arr[10] = { 0 };

一次性开辟一块连续的空间(在这里为4*10==4字节)

但有局限

1.空间开辟的大小是固定的

2.数组空间一旦确定了大小不能调整

为了解决上方的局限,C语言引入了动态内存开辟的函数malloc,free,calloc,recalloc来进行动态内存分配

2.malloc函数

cplusplus的介绍 点我跳转

malloc:memory allocation

cplusplus网翻译

函数

malloc


void* malloc (size_t size);

分配内存块

分配以字节为单位的内存块,返回一个指向内存块起点的指针

新分配的内存块的内容不会被初始化,保留不确定的值

如果大小(size)为0,返回值依靠特定的库来实现,它可能是也可能不是一个空指针(即不确定是什么类型的指针,因为C标准没有定义),但返回的指针不应被解引用

参数


size:以字节为单位的内存块的大小

size_t是无符号整型

返回值


成功时,指向内存块的指针被函数分配

指针的类型总为void*,它可以被转换为所需的数据指针类型以便解引用

如果函数不能为请求的内存块分配,则返回一个空指针

提炼要点

1.使用前要加#include <stdlib.h>

2.接受返回值时,可能需要强制类型转换(malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定)

#include <stdlib.h>
int main()
{
    int* p = (int*)malloc(5);//开辟5个字节的空间
    return 0;
}

因为p是int*类型,因此返回值被强制类型转换为int*型

3.如果开辟内存成功,则返回一个指向开辟好空间的指针

4.如果开辟失败,则返回一个空指针,因此malloc函数的返回值一定要做检查

检查方法:

 if (p == NULL)
 {
     printf("返回空指针");
     return 1;//错误返回
 }
 else
 {
    //使用空间
 }

5.如果参数size 为0,行为C标准是未定义malloc函数的行为的,取决于编译器

回忆变量存储的三个地区:4.【C语言】初识常量与变量

操作内存空间

通过对指针的解引用来为开辟的内存空间存值

01.开辟内存空间成功

#include <stdio.h>
#include <stdlib.h>
int main()
{
        int* p = (int*)malloc(5);
        if (p != NULL)
        {
            *p = 1;
            printf("%d", *p);
            return 0;
        }
        else
        {
            perror("malloc");
            return 1;
        }
}

将*p处的内存空间按整型(4bytes)赋值为1

x86+debug环境下,打开内存窗口

执行完int* p = (int*)malloc(5);后,输入p

从0x00C45F20开始,5个cd为开辟的内存空间

执行完*p = 1;后,再次查看

由于被强制类型转换为int类型,故执行4 bytes

注:前面要判断p不为空指针(否则显示)

如果对int* p = (int*)malloc(5);多换几个数字试试,会发现开辟的内存空间的结尾总是跟着4个fd

02.开辟内存空间失败

x86+debug环境下

将上方的代码的int* p = (int*)malloc(5);改为int* p = (int*)malloc(INT_MAX);

注:

2147483647bytes==2097151.999023438KB==2,047.999999046326MB=1.999999999068677GB

如果是x64+debug环境下,可能会成功

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW混合控制器质量检测

随着工业自动化水平的提高&#xff0c;对控制器的精度、稳定性、可靠性要求也在不断上升。特别是在工程机械、自动化生产、风力发电等领域&#xff0c;传统的质量检测方法已无法满足现代工业的高要求。因此&#xff0c;开发一套自动化、精确、可扩展的混合控制器质量检测平台成…

Web安全 - 阶段性总结回顾_风险评估

文章目录 OWASP 2023 TOP 10用户数据的威胁评估密码盗窃XSS 漏洞SQL 注入CSRF 漏洞 资产数据的威胁评估SSRF 漏洞反序列化漏洞插件漏洞后门 认证和授权的安全防护检测与过滤加强认证补丁管理 进一步防护手段最小权限原则WAFIDS 小结 OWASP 2023 TOP 10 OWASP Top 10 概述 OWASP…

类似 o1 的推理-Llama3.1-70b 提供支持的 g1 创建推理链

g1简介: g1 是一个利用 Llama 3.1 70b 模型在 Groq 硬件上实现类似 OpenAI o1 推理链能力的开源项目。它通过精心设计的提示策略来引导语言模型进行逐步推理&#xff0c;从而解决了传统语言模型在逻辑推理方面的不足。g1 项目的目标是探索如何利用提示策略来提高语言模型的推理…

InfoGAN:通过信息最大化生成对抗网络进行可解释的表示学习

系列文章目录 一 Conditional Generative Adversarial Nets 二 cGANs with Projection Discriminator 三 Conditional Image Synthesis with Auxiliary Classifier GANs 四 InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial…

python 棒棒糖图

结果&#xff1a; import matplotlib.pyplot as plt import matplotlib.ticker as ticker import numpy as npdef lolly_plot(x, y, color_lis, breaks, back_color,title, sub_title):# 获取每个点的颜色colors [assign_color(temperature, breaks, color_lis) for temperatu…

想学道家智慧,误打误撞被儒家引导读《道德经》?这是怎么回事?

想学道家智慧&#xff0c;却误打误撞被儒家引导读《道德经》&#xff1f;这是怎么回事&#xff1f; 原来&#xff0c;这其中的缘由可以追溯到汉代。董仲舒等人在整理文献时&#xff0c;对《老子》进行了修改和补充&#xff0c;形成了所谓的《道德经》。这一版本不仅颠覆了原本…

【玩转 JS 函数式编程_004】1.4 如何应对 JavaScript 的不同版本

本节目录 1.4 如何应对 JavaScript 的不同版本 How do we work with JavaScript?1.4.1. 使用转译工具 Using transpilers1.4.2. 应用在线环境 Working online1.4.3. 测试环境 Testing 1.4 如何应对 JavaScript 的不同版本 How do we work with JavaScript? 上面介绍的语言特…

netty之Netty传输文件、分片发送、断点续传

前言 1&#xff1a;在实际应用中我们经常使用到网盘服务&#xff0c;他们可以高效的上传下载较大文件。那么这些高性能文件传输服务&#xff0c;都需要实现的分片发送、断点续传功能。 2&#xff1a;在Java文件操作中有RandomAccessFile类&#xff0c;他可以支持文件的定位读取…

【递归】13. leetcode 1457. 二叉树中的伪回文路径

1 题目描述 题目链接&#xff1a;二叉树中的伪回文路径 2 解答思路 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系到具体函数体怎么写&#xff0c;是一个宏观的过…

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化 阿里 MySQL 命名规范MySQL8 DDL的原子化 阿里 MySQL 命名规范 【强制】表名、字段名必须使用小写字母或数字&#xff0c;禁止出现数字开头&#xff0c;禁止两个下划线中间只出现数字。数据库字段名的修改代价…

使用 Elastic 将 AI 摘要添加到你的网站

作者&#xff1a;来自 Elastic Gustavo Llermaly 我们目前所知道的搜索&#xff08;搜索栏、结果、过滤器、页面等&#xff09;已经取得了长足的进步&#xff0c;并实现了多种不同的功能。当我们知道找到所需内容所需的关键字或知道哪些文档包含我们想要的信息时&#xff0c;尤…

云计算SLA响应时间的matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 用matlab模拟&#xff0c;一个排队理论。输入一堆包&#xff0c;经过buffer&#xff08;一个或者几个都行&#xff09;传给server&#xff0c;这些包会在buffer里…

热网无线监测系统/config.aspx接口存在反射性XSS漏洞

漏洞描述 热网无线监测系统/config.aspx接口存在反射性XSS漏洞 漏洞复现 FOFA body"Downloads/HDPrintInstall.rar" || body"skins/login/images/btn_login.jpg" POC IP/config.aspx POC <script>alert(1)</script> 点击确认成功弹窗1

C++继承与菱形继承(一文了解全部继承相关基础知识和面试点!)

目的减少重复代码冗余 Class 子类(派生类) &#xff1a; 继承方式 父类&#xff08;基类&#xff09; 继承方式共有三种&#xff1a;公共、保护、私有 父类的私有成员private无论哪种继承方式都不可以被子类使用 保护protected权限的内容在类内是可以访问&#xff0c;但是在…

kubernetes-强制删除命名空间

一、故障现象 1、删除命名空间卡住、强制删除也卡住 2、其他终端显示命名空间下无资源 二、处理步骤 1、kubectl get namespace cilium-test -o json > temp.json 获取你需要删除的命名空间json描述文件。 2、修改finalize字段 3、替换 kubectl replace --raw "/api/v1…

csdn加目录,标题

最简单的办法是&#xff0c; 目录 先写文章&#xff0c; 在给需要加标题的&#xff0c; 给他添加格式为标题一&#xff0c; 在点目录 先写文章&#xff0c; 在给需要加标题的&#xff0c; 给他添加格式为标题一&#xff0c; 最后点目录就会生成目录在文章前面了&#x…

AMD GPU推理:三步让你了解AI推理的游戏规则

我们常听到“AI推理”这个词,但很多朋友可能只了解个大概。如果你对AI有基本的认识,可能会好奇:AMD的GPU怎么在推理中大展拳脚?它跟常见的NVIDIA相比又如何?今天,我们就来聊聊这个问题。你可能在考虑选购GPU或者在项目中使用AMD,本文将带你从实际应用出发,一步步拆解。…

云原生(四十一)| 阿里云ECS服务器介绍

文章目录 阿里云ECS服务器介绍 一、云计算概述 二、什么是公有云 三、公有云优缺点 1、优点 2、缺点 四、公有云品牌 五、市场占有率 六、阿里云ECS概述 七、阿里云ECS特点 阿里云ECS服务器介绍 一、云计算概述 云计算是一种按使用量付费的模式&#xff0c;这种模式…

Stable Diffusion绘画 | 来训练属于自己的模型:炼丹参数调整--步数设置与计算

要想训练一个优质的模型&#xff0c;一定要认识和了解模型训练中&#xff0c;参数的作用和意义。 整个模型训练的过程&#xff0c;参数并不是一成不变的&#xff0c;也没有固定的模板&#xff0c; 当我们修改了模型训练里面的某个参数&#xff0c;很可能就需要连带其他一系列…

USB外设的Device与Host的差异

USB&#xff0c;Universal Serial Bus。 USB协会&#xff1a; USB-IF协会认证&#xff1a;USB IF全称USB Implementers Forum&#xff0c;是由一群开发通用串行总线规范的公司创立的非营利性组织。USB-IF组织的成立旨在推广通用串行总线技术并提供相应的技术规范&#xff0c;…