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

2024-07-30 08:54:43 浏览数 (1)

前言

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函数
    • 用于分配指定字节数的内存空间,并返回一个指向该内存空间的指针。语法如下:
代码语言:javascript复制
void* malloc(size_t size);

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

代码语言:javascript复制
int* dynamicVariable = (int*)malloc(sizeof(int));

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

  • 注意:
    • `malloc`函数返回的指针类型是`void*`,需要进行类型转换才能赋值给其他类型的指针
    • `malloc`函数只分配内存空间,并不对其进行初始化
  • calloc函数
    • 用于分配指定数量和大小的连续内存空间,并返回一个指向该内存空间的指针。与malloc不同的是,calloc函数会将分配的内存空间清零,即将所有位都设置为0。语法如下:
代码语言:javascript复制
void* calloc(size_t num, size_t size);

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

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

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

代码语言:javascript复制
dynamicArray = (double*)realloc(dynamicArray, 10 * sizeof(double)); 

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

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

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

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

代码语言:javascript复制
free(dynamicVariable);

程序实例

代码语言:javascript复制
#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函数释放动态分配的内存空间。

0 人点赞