动态数组
在 C 语言中,动态数组指的是在程序运行时动态分配的数组,其大小不需要在编译时确定。我们通过动态内存分配函数(如 malloc
、calloc
和 realloc
)来实现动态数组。
动态数组的基本操作
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()
来释放分配的内存。
calloc
分配动态数组:calloc
是另一种动态内存分配函数,它会将分配的内存初始化为零。语法:
void* calloc(size_t num, size_t size);
例如:
int* array = (int*) calloc(n, sizeof(int));
calloc
与malloc
的主要区别是,calloc
分配的内存会被初始化为零,而malloc
分配的内存是未初始化的。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;
}
总结:
- 动态数组的大小在运行时分配,不需要在编译时确定。
- 使用
malloc
或calloc
来分配动态数组,使用realloc
来调整数组大小。 - 使用完动态数组后,记得调用
free()
来释放内存。