在 C 语言中,动态数组指的是在程序运行时动态分配的数组,其大小不需要在编译时确定。我们通过动态内存分配函数(如 malloccallocrealloc)来实现动态数组。

动态数组的基本操作

  1. malloc 分配动态数组
    malloc 函数可以分配指定大小的内存。它返回一个 void* 类型的指针,需要强制转换为适当的指针类型。

    语法:

    void* malloc(size_t size);

    例如,创建一个动态分配的整型数组:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int n;  // 数组的大小
        printf("Enter the number of elements: ");
        scanf("%d", &n);
    
        // 动态分配一个包含 n 个整数的数组
        int* array = (int*) malloc(n * sizeof(int));
    
        // 检查内存分配是否成功
        if (array == NULL) {
            printf("Memory allocation failed!\n");
            return 1;
        }
    
        // 使用数组
        for (int i = 0; i < n; i++) {
            array[i] = i + 1;  // 示例填充数组
        }
    
        // 打印数组
        for (int i = 0; i < n; i++) {
            printf("%d ", array[i]);
        }
        printf("\n");
    
        // 释放内存
        free(array);
    
        return 0;
    }
    • malloc 分配 n * sizeof(int) 个字节,用于存储 n 个整数。
    • 如果内存分配失败,malloc 返回 NULL,程序可以通过这个指针检查分配是否成功。
    • 使用完动态数组后,必须调用 free() 来释放分配的内存。
  2. calloc 分配动态数组
    calloc 是另一种动态内存分配函数,它会将分配的内存初始化为零。

    语法:

    void* calloc(size_t num, size_t size);

    例如:

    int* array = (int*) calloc(n, sizeof(int));

    callocmalloc 的主要区别是,calloc 分配的内存会被初始化为零,而 malloc 分配的内存是未初始化的。

  3. realloc 调整动态数组大小
    如果你需要调整动态数组的大小,可以使用 realloc 函数。它会重新分配内存,保留原有的数据内容。

    语法:

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

    例如:

    array = (int*) realloc(array, new_size * sizeof(int));
    • realloc 接收一个指向之前分配内存的指针 ptr 和新的大小 new_size
    • 如果重新分配失败,realloc 返回 NULL,原来的内存块依然有效。

示例:使用 realloc 调整数组大小

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5;
    int* array = (int*) malloc(n * sizeof(int));

    // 填充数组
    for (int i = 0; i < n; i++) {
        array[i] = i + 1;
    }

    printf("Original array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    // 调整数组大小
    int new_size = 10;
    array = (int*) realloc(array, new_size * sizeof(int));

    // 为新数组的元素赋值
    for (int i = n; i < new_size; i++) {
        array[i] = i + 1;
    }

    printf("Resized array: ");
    for (int i = 0; i < new_size; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    // 释放内存
    free(array);

    return 0;
}

总结:

  • 动态数组的大小在运行时分配,不需要在编译时确定。
  • 使用 malloccalloc 来分配动态数组,使用 realloc 来调整数组大小。
  • 使用完动态数组后,记得调用 free() 来释放内存。

标签: none

添加新评论