【重拾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函数释放动态分配的内存空间。

相关推荐
Legendary_0088 分钟前
LDR6020驱动的Type-C接口显示器解决方案
c语言·开发语言·计算机外设
techdashen12 分钟前
Go context.Context
开发语言·后端·golang
凡人的AI工具箱14 分钟前
40分钟学 Go 语言高并发:Select多路复用
开发语言·后端·架构·golang
苏言の狗16 分钟前
CCF认证202406-01 | 矩阵重塑(其一)
c语言·数据结构·c++·算法·矩阵
ModelBulider20 分钟前
SpringMVC应用专栏介绍
java·开发语言·后端·spring·springmvc
恬淡虚无真气从之21 分钟前
go 结构体方法
开发语言·后端·golang
java 乐山22 分钟前
ThinkPad t61p 作SMB服务器,打印服务器,pc ,android ,ipad利用此服务器互传文件
c语言
licy__22 分钟前
Python BeautifulSoup 常用语句详解
开发语言·python·beautifulsoup
努力的Java程序员23 分钟前
后端接受大写参数(亲测能用)
java·开发语言
一雨方知深秋28 分钟前
WEB APIS(DOM对象,操作元素内容,属性,表单属性,自定义属性,定时器)
开发语言·前端·javascript