1、使用动态内存分配返回数组
通过 malloc
或 calloc
分配的动态内存在函数返回后仍然有效,因此可以在函数中分配数组并返回其指针。调用方负责释放分配的内存。
#include <stdio.h> #include <stdlib.h> int* createArray(int size) { int* array = (int*)malloc(size * sizeof(int)); // 动态分配数组 if (array == NULL) { return NULL; // 检查内存分配是否成功 } for (int i = 0; i < size; i++) { array[i] = i; // 初始化数组 } return array; // 返回指针 } int main() { int size = 5; int* arr = createArray(size); // 接收返回的指针 if (arr != NULL) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); free(arr); // 释放动态分配的内存 } return 0; }
2、使用全局变量
数组可以声明为全局变量,然后在函数中对其进行修改。全局数组在整个程序执行期间有效,但这种方法不具备通用性,因为不同函数共用同一个数组。
#include <stdio.h> #define SIZE 5 int globalArray[SIZE]; // 全局数组 int* getGlobalArray() { for (int i = 0; i < SIZE; i++) { globalArray[i] = i; // 初始化数组 } return globalArray; // 返回指向全局数组的指针 } int main() { int* arr = getGlobalArray(); for (int i = 0; i < SIZE; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
3、使用结构体包装数组
可以将数组放入结构体中,然后返回结构体的实例。这样做可以避免数组退化为指针,保留数组的大小信息。
#include <stdio.h> #define SIZE 5 typedef struct { int array[SIZE]; } ArrayWrapper; ArrayWrapper createArray() { ArrayWrapper wrapper; for (int i = 0; i < SIZE; i++) { wrapper.array[i] = i; // 初始化结构体中的数组 } return wrapper; // 返回结构体 } int main() { ArrayWrapper arrWrapper = createArray(); // 接收结构体 for (int i = 0; i < SIZE; i++) { printf("%d ", arrWrapper.array[i]); } printf("\n"); return 0; }
4、使用指针作为输出参数
通过将指针传递给函数并在函数中修改该指针指向的数组,可以避免直接返回数组。该方法适合在调用方已经分配好数组内存的情况下使用。
#include <stdio.h> void fillArray(int* array, int size) { for (int i = 0; i < size; i++) { array[i] = i; // 填充数组 } } int main() { int size = 5; int arr[size]; // 在调用方分配数组 fillArray(arr, size); // 通过指针填充数组 for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }