C 中数组的动态内存分配

作者:编程家 分类: arrays 时间:2025-06-19

当我们在编写 C 语言程序时,经常需要处理动态大小的数据集合。数组是其中常用的数据结构之一,但有时我们无法预先确定数组的大小,这就需要使用动态内存分配。C 语言提供了一些函数来在运行时动态分配内存,其中最常用的是 `malloc()`、`calloc()` 和 `realloc()` 函数。让我们来看看如何使用这些函数来动态分配数组的内存空间。

### malloc() 函数

`malloc()` 函数用于在堆上动态地分配指定数量的字节。它接受一个参数,即要分配的内存大小(以字节为单位),并返回指向分配内存起始位置的指针。以下是一个简单的例子,展示如何使用 `malloc()` 动态分配一个整数数组的内存空间:

c

#include

#include

int main() {

int n = 5; // 假设要分配的数组大小为 5

// 使用 malloc 分配整数数组的内存空间

int *arr = (int *)malloc(n * sizeof(int));

if (arr == NULL) {

printf("内存分配失败%

");

return 1;

}

// 将数组初始化为一些值

for (int i = 0; i < n; i++) {

arr[i] = i * 10;

}

// 打印数组的值

printf("分配的数组:%

");

for (int i = 0; i < n; i++) {

printf("%d ", arr[i]);

}

// 释放动态分配的内存空间

free(arr);

return 0;

}

在这个例子中,我们使用 `malloc()` 函数动态分配了一个包含5个整数的数组内存空间。然后,我们对数组进行了初始化,并最后释放了动态分配的内存空间,以避免内存泄漏。

### calloc() 函数

`calloc()` 函数与 `malloc()` 类似,不同之处在于它在分配内存时会把分配的内存空间初始化为零。它接受两个参数:要分配的元素数量和每个元素的大小(以字节为单位)。以下是一个示例,展示了如何使用 `calloc()` 动态分配一个浮点数数组的内存空间并将其初始化为零:

c

#include

#include

int main() {

int n = 8; // 假设要分配的数组大小为 8

// 使用 calloc 分配浮点数数组的内存空间并初始化为零

float *arr = (float *)calloc(n, sizeof(float));

if (arr == NULL) {

printf("内存分配失败%

");

return 1;

}

// 打印数组的值

printf("分配的数组(初始化为零):%

");

for (int i = 0; i < n; i++) {

printf("%.2f ", arr[i]);

}

// 释放动态分配的内存空间

free(arr);

return 0;

}

在这个例子中,我们使用 `calloc()` 分配了一个包含8个浮点数的数组内存空间,并将其初始化为零。最后,我们释放了动态分配的内存空间。

### realloc() 函数

`realloc()` 函数用于重新分配先前使用 `malloc()`、`calloc()` 或 `realloc()` 分配的内存空间大小。它接受两个参数:先前分配内存空间的指针和新的内存大小。以下是一个示例,展示了如何使用 `realloc()` 函数扩展先前分配的数组内存空间:

c

#include

#include

int main() {

int n = 5; // 假设初始分配的数组大小为 5

// 使用 malloc 分配整数数组的内存空间

int *arr = (int *)malloc(n * sizeof(int));

if (arr == NULL) {

printf("内存分配失败%

");

return 1;

}

// 假设需要将数组大小扩展到 8

int new_size = 8;

// 使用 realloc 扩展数组内存空间

arr = (int *)realloc(arr, new_size * sizeof(int));

if (arr == NULL) {

printf("内存重新分配失败%

");

return 1;

}

// 打印扩展后数组的值

printf("扩展后的数组:%

");

for (int i = 0; i < new_size; i++) {

printf("%d ", arr[i]);

}

// 释放动态分配的内存空间

free(arr);

return 0;

}

在这个例子中,我们先用 `malloc()` 分配了一个包含5个整数的数组内存空间。然后使用 `realloc()` 函数将数组大小扩展到8个整数,并最后释放了动态分配的内存空间。

动态内存分配是在 C 编程中非常有用的技术,但在使用时需要谨慎处理分配和释放内存的操作,以避免内存泄漏和错误的访问。