📅  最后修改于: 2023-12-03 15:37:50.043000             🧑  作者: Mango
在 C 语言中,数组是一个固定大小的数据结构。当我们在编写程序时,数组的大小可能不够,需要对其进行扩展,本文将介绍三种方法来增加数组的大小:重新分配内存、使用静态存储和使用动态存储。
可以使用 realloc()
函数来重新分配已分配内存的大小。该函数的原型如下:
void *realloc(void *ptr, size_t size);
这个函数将重新分配 ptr
指针指定的内存块的大小。如果新的大小比原来的大小大,那么新内存中的值将不确定。如果新的大小比原来的大小小,那么多余的内存将自动释放。
以下是使用 realloc()
函数来增加数组大小的示例代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = NULL;
int size = 5;
arr = (int*) malloc(size * sizeof(int));
// 分配初始内存空间
for(int i = 0; i < size; i++) {
arr[i] = i;
}
// 输出初始数组
printf("Initial array:\n");
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 重新分配内存空间,并添加新元素
size = 10;
arr = (int*) realloc(arr, size * sizeof(int));
for(int i = 5; i < size; i++) {
arr[i] = i;
}
// 输出新数组
printf("Extended array:\n");
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
// 释放内存空间
return 0;
}
在上述代码中,我们使用 malloc()
函数分配了初始的数组内存空间,然后使用 realloc()
函数将其扩展到了 10 个元素,并添加了新元素。最后使用 free()
函数来释放数组的内存空间。
在 C 语言中,使用静态存储来定义数组是另一种增加数组大小的方法。静态存储在程序开始时就被分配,直到程序结束才会被释放。因此,使用静态存储定义数组可以保证数组的大小在整个程序运行过程中不会改变。
以下是使用静态存储定义数组来增加数组大小的示例代码:
#include <stdio.h>
#define SIZE1 5
#define SIZE2 10
int main() {
static int arr[SIZE1] = {0, 1, 2, 3, 4};
// 定义初始数组
for(int i = 0; i < SIZE1; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 输出初始数组
int temp[SIZE2];
for(int i = 0; i < SIZE1; i++) {
temp[i] = arr[i];
}
for(int i = SIZE1; i < SIZE2; i++) {
temp[i] = i;
}
for(int i = 0; i < SIZE2; i++) {
arr[i] = temp[i];
}
// 扩展数组
for(int i = 0; i < SIZE2; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 输出新数组
return 0;
}
在上述代码中,我们使用静态存储定义了初始的数组,并使用临时数组 temp
来保存初始数组的元素,然后将 temp
中的元素和新的元素赋值给 arr
数组来扩展数组。
最后,还可以使用动态存储来增加数组的大小。动态存储是使用 malloc()
、calloc()
和 realloc()
函数等动态分配内存的方法来定义变量。使用动态存储定义数组的好处是可以根据需要调整数组大小。
以下是使用动态存储来定义数组来增加数组大小的示例代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = NULL;
int size = 5;
arr = (int*) malloc(size * sizeof(int));
// 定义初始数组
for(int i = 0; i < size; i++) {
arr[i] = i;
}
// 输出初始数组
printf("Initial array:\n");
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
size = 10;
int *temp = (int*) calloc(size, sizeof(int));
for(int i = 0; i < size; i++) {
if(i < size - 5) {
temp[i] = arr[i];
} else {
temp[i] = i;
}
}
// 扩展数组
arr = temp;
// 输出新数组
printf("Extended array:\n");
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
// 释放内存空间
return 0;
}
在上述代码中,我们使用 malloc()
函数定义了初始数组,并使用 calloc()
函数动态分配了一个大小为 10 的数组 temp
,将 arr
数组的元素和新的元素赋值给 temp
数组,然后将 temp
数组的地址赋值给 arr
数组,以扩展数组大小。最后使用 free()
函数释放数组的内存空间。
以上就是三种增加数组大小的方法,每种方法都有自己的优缺点,需要根据实际情况选择合适的方法。