C语言 函数返回数组的问题

C语言中,不能直接返回数组,因为数组的名字在表达式中通常会“退化”为指向其首元素的指针,而数组本身的大小信息则丢失了。此外,局部数组在函数返回后会被释放,从而导致返回无效的指针。但可以在C中“返回”数组或类似的数据结构。

1、使用动态内存分配返回数组

通过 malloccalloc 分配的动态内存在函数返回后仍然有效,因此可以在函数中分配数组并返回其指针。调用方负责释放分配的内存。

#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;
}

推荐阅读
cjavapy编程之路首页