C语言基础教程(动态内存分配)

news/2024/11/22 21:20:58/

文章目录

  • 前言
  • 一、动态内存分配常用函数
  • 二、动态内存分配实战
  • 总结


前言

本篇文章来讲解C语言中的动态内存分配,在C语言中动态内存分配经常使用,合理的使用动态内存分配可以帮助我们节省代码空间,当然了不合理的使用可能导致程序的崩溃,或者是内存的泄漏。

一、动态内存分配常用函数

在 C 语言中,动态内存分配是一种在程序运行时分配和释放内存的机制。它允许程序根据需要动态地管理内存,以便灵活地创建、使用和销毁变量和数据结构。动态内存分配使用以下四个函数来执行相关操作:malloc、calloc、realloc 和 free。

1.malloc 函数:
malloc(memory allocate)函数用于在堆(heap)区分配指定大小的内存块,并返回指向分配的内存块的指针。其语法如下:

void* malloc(size_t size);

其中 size 是要分配的字节数。malloc 返回一个指向分配内存块的指针,如果分配失败,则返回 NULL。

2.calloc 函数:
calloc(contiguous allocation)函数用于在堆区分配指定数量和大小的连续内存块,并将其初始化为 0。其语法如下:

void* calloc(size_t num, size_t size);

其中 num 是要分配的元素数量,size 是每个元素的字节数。calloc 返回一个指向分配内存块的指针,如果分配失败,则返回 NULL。

3.realloc 函数:
realloc(reallocate)函数用于重新分配之前通过 malloc 或 calloc 分配的内存块的大小。其语法如下:

void* realloc(void* ptr, size_t size);

其中 ptr 是之前分配的内存块的指针,size 是要重新分配的字节数。realloc 返回一个指向重新分配内存块的指针,如果分配失败,则返回 NULL。注意,realloc 可能会将已分配内存的内容复制到新的内存块中,因此原内存块的内容可能会丢失或损坏。

4.free 函数:
free 函数用于释放通过 malloc、calloc 或 realloc 分配的内存块。其语法如下:

void free(void* ptr);

其中 ptr 是要释放的内存块的指针。调用 free 将释放该内存块,并该内存区域变为可用状态,可以供后续的动态内存分配使用。

使用动态内存分配可以在程序运行时灵活地处理变量和数据结构的内存需求,避免静态内存分配的固定限制。但是,使用动态内存分配时需要注意内存泄漏和悬挂指针等问题,确保正确释放已分配的内存,并避免出现未定义的行为。

二、动态内存分配实战

1.使用 malloc 分配内存:

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int size = 5;// 在堆上分配大小为 size * sizeof(int) 的内存块ptr = (int*)malloc(size * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存块for (int i = 0; i < size; i++) {ptr[i] = i + 1;}// 打印内存块中的值for (int i = 0; i < size; i++) {printf("%d ", ptr[i]);}// 释放内存块free(ptr);return 0;
}

2.使用 calloc 分配内存:

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int size = 5;// 在堆上分配大小为 size * sizeof(int) 的内存块,并初始化为 0ptr = (int*)calloc(size, sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存块for (int i = 0; i < size; i++) {ptr[i] = i + 1;}// 打印内存块中的值for (int i = 0; i < size; i++) {printf("%d ", ptr[i]);}// 释放内存块free(ptr);return 0;
}

3.使用 realloc 重新分配内存:

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int size = 5;// 在堆上分配大小为 size * sizeof(int) 的内存块ptr = (int*)malloc(size * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存块for (int i = 0; i < size; i++) {ptr[i] = i + 1;}// 打印内存块中的值for (int i = 0; i < size; i++) {printf("%d ", ptr[i]);}// 重新分配内存块大小为 10 * sizeof(int)ptr = (int*)realloc(ptr, 10 * sizeof(int));if (ptr == NULL) {printf("内存重新分配失败\n");return 1;}// 使用重新分配的内存块for (int i = size; i < 10; i++) {ptr[i] = i + 1;}// 打印内存块中的值for (int i = 0; i < 10; i++) {printf("%d ", ptr[i]);}// 释放内存块free(ptr);return 0;
}

总结

本篇文章就讲解到这里,大家可以多加练习更好的掌握本篇文章的知识点。


http://www.ppmy.cn/news/444355.html

相关文章

59、基于51单片机多机 NRF24L01 无线温湿度 DHT11报警系统设计(程序+原理图+PCB源文件+参考论文+开题报告+任务书+元器件清单等)

摘 要 温湿度在工农业生产中占有很重要的地位&#xff0c;是工农业生产的重要组成数据。温湿度过高会造成粮食发霉长芽&#xff0c;还会引起大棚蔬菜一系列的病害。因此对其适时准确的测量就显得尤为重要。而一般的测量过程较为复杂繁琐&#xff0c;误差还大。比如现在所使…

C++实验报告-1

C实验报告-1 实验题目1 【旱冰场围栏造价】有一个圆形的旱冰场地&#xff0c;围栏用帆布围成&#xff0c;每平方米造价M元&#xff0c;输入旱冰场半径和围栏高度&#xff0c;用程序计算出其造价。类的声明已给出&#xff0c;请完善成员函数的定义和主函数。 程序源代码 #inc…

电商行业线上活动方式有哪些优缺点(一)

电商行业线上活动方式有哪些优缺点&#xff08;一&#xff09; 如今电商行业发展的越来越快速&#xff0c;而且电商行业的线上活动营销方式也越来越多&#xff0c;商家们总能把握住各种节假日做营销活动。例如三月份的三八妇女节&#xff0c;传统的节假日&#xff0c;十一月份…

vgp虚拟路面_吉水县道路运输展示价格实惠

吉水县道路运输展示价格实惠 北京四度的道路运输展示&#xff0c;首先&#xff0c;我们要知道什么是数字展厅&#xff1f;其实&#xff0c;我们在生活中所听到的数字化展厅&#xff0c;以及多媒体数字化展厅都是指多媒体数字化展厅。多媒体数字化展厅主要是把多媒体和数字化的技…

seo名词术语解释网站优化名词术语

1、图解seo黑帽。什么是黑帽seo&#xff1f; 我们定义seo黑帽这个名词是一切 违背正常思路制作、宣传、推广、排名网站的行为都称为黑帽seo。 这里的seo黑帽也是作弊的概念。 黑帽seo手法侧重于搜索引擎单方面的计算特性&#xff0c;利用一个特点狠狠的用力&#xff0c;短期内达…

程序员为维持游戏开发被迫炒股,没想到一年内反赚1600万

公众号后台回复“图书“&#xff0c;了解更多号主新书内容贾浩楠 博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI “不会炒股的游戏开发不是好飞机修理工….” 没抖机灵&#xff0c;这是真事&#xff01; 一开始我也不信&#xff0c;根本没人信。 辞掉军火巨头旱涝保收的工作&a…

条件生成对抗神经网络,生成对抗网络gan原理

关于GAN生成式对抗网络中判别器的输出的问题 。 ...摘要生成式对抗网络GAN&#xff08;Generativeadversarialnetworks&#xff09;目前已经成为人工智能学界一个热门的研究方向.GAN的基本思想源自博弈论的二人零和博弈&#xff0c;由一个生成器和一个判别器构成&#xff0c;…

【Python】基于大数据下对珠三角部分地区房价分析

一、每题的源代码及注释说明 (主要代码) &#xff08;1&#xff09;编写数据 采取代码&#xff0c;对乐有家里的广州城市进行数据爬取&#xff1a; from selenium import webdriver from lxml import etree import requests import time import csv # 使用selenium模拟网页打…