You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言如何从多个函数返回数组并解决返回值全为0的问题

问题核心原因

你遇到的问题本质是C语言内存管理、函数返回值规则的常见错误,具体问题点如下:

  • 局部数组生命周期问题:函数内部定义的栈区局部数组,会在函数执行结束后随栈帧销毁被自动回收,返回其地址属于野指针访问,属于未定义行为,这是你拿到全0值的核心诱因
  • 函数返回值类型错误:makeArray、arrShuffle需要返回数组首地址,返回值类型应为int*而非int
  • 变量名重定义冲突:arrShuffle函数内又定义了同名局部数组arr,会屏蔽传入的数组指针参数,实际操作的是无效的局部数组
  • 打印逻辑错误:main函数中打印数组时直接输出指针本身orgArr,而非对应下标的元素orgArr[i]
  • 洗牌逻辑下标越界:原代码生成的随机下标范围是120,数组实际有效下标为019,访问arr[20]属于越界访问
修正方案

使用malloc在堆区分配数组内存,堆区内存不会随函数结束自动回收,使用结束后手动调用free释放即可避免内存泄漏。洗牌逻辑优化为标准Fisher-Yates算法,保证打乱的均匀性。

修正后完整代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int* arrShuffle(int * arr);

int* arrShuffle(int * arr) {
    // 直接使用传入的数组指针,不重新定义局部数组
    for(int j=19; j>0; j--) {
        int randInd = rand() % (j + 1);
        int temp = arr[j];
        arr[j] = arr[randInd];
        arr[randInd] = temp;
    }
    return arr;
}

int* makeArray() {
    // 堆区分配20个int类型的内存空间
    int *arr = (int*)malloc(sizeof(int) * 20);
    for(int i=0; i < 20; i++) {
        arr[i] = i + 1;
    }
    return arr;
}

int main() {
    int *orgArr;
    int *modArr;
    srand(time(NULL));

    orgArr = makeArray();
    printf("原数组:\n");
    for(int i=0; i < 20; i++) {
        printf("OrgArr[%d]: %d\n", i, orgArr[i]);
    }

    modArr = arrShuffle(orgArr);
    printf("打乱后数组:\n");
    for(int i=0; i < 20; i++) {
        printf("ModArr[%d]: %d\n", i, modArr[i]);
    }

    // 释放堆内存,避免泄漏
    free(orgArr);
    return 0;
}

内容的提问来源于stack exchange,提问作者laurimikhael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:15:03