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
相关产品推荐
相关产品推荐

