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

本文为数据结构打下基础

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

目录

1.内存开辟的方式

2.malloc函数

cplusplus网翻译

提炼要点

操作内存空间

01.开辟内存空间成功

02.开辟内存空间失败

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


1.内存开辟的方式

01.创建变量

cpp 复制代码
int a = 0;

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

02.创建数组

cpp 复制代码
int arr[10] = { 0 };

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

但有局限

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

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

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

2.malloc函数

cplusplus的介绍 点我跳转

malloc:m emory allocation

cplusplus网翻译

函数

malloc


复制代码
void* malloc (size_t size);

分配内存块

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

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

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

参数


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

size_t是无符号整型

返回值


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

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

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

提炼要点

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

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

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

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

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

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

检查方法:

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

养成良好习惯,判断是否为空指针

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

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

操作内存空间

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

01.开辟内存空间成功

cpp 复制代码
#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环境下,可能会成功

相关推荐
ULTRA??4 分钟前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色20 分钟前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself30 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
XiaoLeisj41 分钟前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
半桶水专家1 小时前
go语言中package详解
开发语言·golang·xcode
llllinuuu1 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s1 小时前
Golang--协程和管道
开发语言·后端·golang
王大锤43911 小时前
golang通用后台管理系统07(后台与若依前端对接)
开发语言·前端·golang