C语言如何将函数内数组通过指针返回至main程序及错误求解
问题根本原因
- 你在
suma_arreglo函数内定义的arraysum属于栈区局部变量,它的生命周期仅和当前函数的运行周期绑定:函数执行结束后对应的栈帧会被系统回收,这块内存的内容会被后续其他操作覆盖,你返回的数组地址直接变成野指针,main函数访问该地址属于未定义行为,就会出现运行异常、输出乱码、程序崩溃等问题。 - 函数声明的返回值类型是
int,但实际你要返回的是int*类型的数组指针,类型不匹配本身就存在编译错误。
修复方案
这里提供三种常用的可行实现,优先推荐第二种:
- 方案一:将局部数组声明为静态存储
把arraysum声明为static类型,静态变量存储在全局静态区,生命周期和整个程序运行周期一致,函数退出后内存不会被回收。需要注意静态数组不能使用变长定义,直接用你预设的宏MAX作为长度即可,同时修正函数返回值类型为int*。
// 修改后的函数实现 int* suma_arreglo(int x1[], int x2[], int y) { int cont; static int arraysum[MAX]; // 静态数组,用常量定长 for(cont = 0; cont < y; cont++) { arraysum[cont] = x1[cont] + x2[cont]; } return arraysum; }
- 方案二:main函数预分配结果数组传参(最推荐)
直接在main里定义存储结果的数组,把数组指针作为参数传入suma_arreglo直接写入,不需要返回值,也无需手动管理内存,不存在重入风险。
#include <stdio.h> #include <stdlib.h> #define MAX 10 // 修改后的函数声明 void suma_arreglo(int x1[], int x2[], int y, int res[]); int array1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, array2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 函数实现 void suma_arreglo(int x1[], int x2[], int y, int res[]) { int cont; for(cont = 0; cont < y; cont++) { res[cont] = x1[cont] + x2[cont]; } } int main() { int cont = 0; int sum_res[MAX]; // 预分配结果数组 suma_arreglo(array1, array2, MAX, sum_res); for(cont = 0; cont < MAX; cont++) { printf("\n%d + %d = %d", array1[cont], array2[cont], sum_res[cont]); } puts(""); system("pause"); return 0; }
- 方案三:函数内堆区申请内存
在函数内用malloc在堆区申请内存,堆区内存需要手动调用free释放,避免内存泄漏。
// 修改后的函数实现 int* suma_arreglo(int x1[], int x2[], int y) { int cont; int *arraysum = (int*)malloc(sizeof(int) * y); // 堆区申请内存 for(cont = 0; cont < y; cont++) { arraysum[cont] = x1[cont] + x2[cont]; } return arraysum; } // main内使用完后释放内存 // ... 遍历打印逻辑结束后 free(suma);
内容的提问来源于stack exchange,提问作者Charl_y
相关产品推荐
相关产品推荐

