【重拾C语言】十三、动态数据组织(一)动态变量(malloc、calloc、realloc、free)

目录

前言

十三、动态数据组织

[13.1 动态数据组织](#13.1 动态数据组织)

[13.2 动态变量](#13.2 动态变量)

malloc函数

calloc函数

realloc函数

free函数

程序实例


前言

C语言中的动态数据组织是指在程序运行时根据需要动态地分配内存空间来存储数据。这允许程序在运行时根据实际需求来创建、修改和释放数据结构,而不是在编译时固定地分配内存。

十三、动态数据组织

13.1 动态数据组织

C语言是一种通用的编程语言,它提供了一些基本的数据结构和静态数组来存储和组织数据。然而,C语言本身并没有提供内置的动态数据结构,如动态数组或链表。要实现动态数据组织,通常需要手动编写代码来管理内存分配和释放。在C语言中,可以使用指针和动态内存分配函数 来实现动态数据结构

  • 动态内存分配函数包括malloc、calloc和realloc
    • malloc函数用于分配指定大小的内存空间
    • calloc函数用于分配指定数量和大小的内存空间并将其初始化为零
    • realloc函数用于重新分配已分配内存的大小

使用动态内存分配函数,可以创建动态数组。动态数组的大小可以在运行时根据需要进行调整,而不需要预先指定固定的大小。通过动态内存分配函数,可以根据实际需求动态地增加或减少数组的大小。

此外,通过使用指针和相关的数据结构,如链表,也可以实现动态数据组织。链表是一种由节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。通过适当的操作,可以在运行时插入、删除和修改链表中的元素。

指针相关知识,参考前文:

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针-CSDN博客https://blog.csdn.net/m0_63834988/article/details/133690334?spm=1001.2014.3001.5501【重拾C语言】七、指针(二)指针与数组(用指针标识数组、多维数组与指针、数组指针与指针数组)-CSDN博客https://blog.csdn.net/m0_63834988/article/details/133753904?spm=1001.2014.3001.5501【重拾C语言】七、指针(三)指针与字符串(字符串与字符串数组;指针与字符串的遍历、拷贝、比较;反转字符串)_QomolangmaH的博客-CSDN博客https://blog.csdn.net/m0_63834988/article/details/133755405?spm=1001.2014.3001.5501

13.2 动态变量

动态变量是指在程序运行时动态分配内存的变量。在C语言中,可以使用动态内存分配函数malloccallocrealloc来创建动态变量。下面简要介绍这些函数的作用:

malloc函数

  • 用于分配指定字节数的内存空间,并返回一个指向该内存空间的指针。语法如下:
cpp 复制代码
void* malloc(size_t size);

`size`参数是要分配的字节数。要动态分配一个`int`类型的变量,可以使用以下代码:

cpp 复制代码
int* dynamicVariable = (int*)malloc(sizeof(int));

这里的`sizeof(int)`用于获取`int`类型变量所占的字节数,然后`malloc`函数根据这个大小分配相应的内存空间。

  • 注意:

    • `malloc`函数返回的指针类型是`void*`,需要进行类型转换才能赋值给其他类型的指针
    • `malloc`函数只分配内存空间,并不对其进行初始化

calloc函数

  • 用于分配指定数量和大小的连续内存空间,并返回一个指向该内存空间的指针。与malloc不同的是,calloc函数会将分配的内存空间清零,即将所有位都设置为0。语法如下:
cpp 复制代码
void* calloc(size_t num, size_t size);

这里的`num`参数是要分配的元素数量,`size`参数是每个元素的大小。要动态分配一个包含5个`double`类型元素的数组:

cpp 复制代码
double* dynamicArray = (double*)calloc(5, sizeof(double));

realloc函数

  • 用于重新分配已经分配的内存空间的大小。通常在需要修改动态变量的大小时使用该函数。语法如下:
cpp 复制代码
void* realloc(void* ptr, size_t size);

这里的`ptr`参数是指向要重新分配的内存空间的指针,`size`参数是重新分配后的新大小。要将先前分配的动态数组增加到10个元素:

cpp 复制代码
dynamicArray = (double*)realloc(dynamicArray, 10 * sizeof(double)); 

`realloc`函数会根据新的大小重新分配内存空间,并返回一个指向重新分配后内存空间的指针。需要注意的是,如果重新分配失败,`realloc`函数会返回`NULL`,这时需要处理错误情况。

free函数

  • 使用上述动态内存分配函数,可以创建动态变量,使程序能够根据需要动态地管理内存,从而更灵活地处理数据。在使用完动态变量后,应使用free函数来释放已分配的内存空间,以便系统可以重新利用这些空间:
cpp 复制代码
void free(void* ptr);

动态变量的管理是程序员的责任,必须确保在不再需要动态变量时及时释放其对应的内存空间,以避免内存泄漏和资源浪费的问题。

释放先前分配的动态变量:

cpp 复制代码
free(dynamicVariable);

程序实例

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    int numElements;

    printf("Enter the number of elements: ");
    scanf("%d", &numElements);

    // 动态分配整型数组的内存空间
    int* dynamicArray = (int*)malloc(numElements * sizeof(int));
    if (dynamicArray == NULL) {
        printf("Memory allocation failed.\n");
        return 1;
    }

    // 输入数组元素
    printf("Enter %d elements:\n", numElements);
    for (int i = 0; i < numElements; i++) {
        scanf("%d", &dynamicArray[i]);
    }

    // 输出数组元素
    printf("Array elements: ");
    for (int i = 0; i < numElements; i++) {
        printf("%d ", dynamicArray[i]);
    }
    printf("\n");

    // 释放动态分配的内存空间
    free(dynamicArray);

    return 0;
}

首先输入要创建的动态数组的元素数量,然后使用malloc函数分配足够的内存空间来存储这些元素,每个元素的大小为sizeof(int)。如果内存分配失败,程序会输出相应的错误信息并返回。接下来,需要逐个输入数组的元素值。最后,程序会输出数组的元素值,并使用free函数释放动态分配的内存空间。

相关推荐
暮色_年华20 分钟前
嵌入式C语言自我修养:GNU C编译器扩展语法精讲
c语言
卑微的Coder21 分钟前
python画正方形、平行四边形、六边形、五角星、风车(四个半圆)
开发语言·python
bugtraq202123 分钟前
Fyne ( go跨平台GUI )中文文档-绘图和动画(三)
开发语言·后端·golang
L_cl1 小时前
数据结构与算法——Java实现 7.习题——反转链表
java·开发语言·链表
原机小子1 小时前
嵌入式系统开发利器:深入解析MATLAB嵌入式系统工具箱
开发语言·matlab·fpga开发
我明天再来学Web渗透1 小时前
【java面经】微服务架构速记
java·开发语言·微服务·云原生·架构
kuilaurence1 小时前
C语言数组学习
c语言·学习·算法
唤醒手腕1 小时前
2024年最新 Python 大数据网络爬虫技术基础案例详细教程(更新中)
开发语言·爬虫·python
秦淮渔火1 小时前
单例模式(饿汉式-懒汉式)
java·开发语言·单例模式
蔚一1 小时前
Java设计模式(单例模式)——单例模式存在的问题(完整详解,附有代码+案例)
java·开发语言·单例模式·设计模式