C语言实现返回数组功能时程序崩溃,如何正确完成数组返回操作?
C语言返回数组实现方案及问题修复
崩溃核心原因
你代码中返回的tempArray是duplicates函数内部定义的栈上局部数组,C语言中栈空间的局部变量会在函数执行结束后自动回收,返回的地址属于非法内存,main函数访问该地址时触发内存访问错误直接崩溃。
Java的数组默认在堆内存分配由GC管理生命周期,和C的栈内存规则完全不同,这是两类语言的核心差异。
正确返回数组的两种常用实现方式
方式1:函数内堆动态分配数组返回
堆内存的生命周期由开发者手动控制,只要不主动释放就可以跨函数访问:
#include <stdio.h> #include <stdlib.h> // 第二个参数n是原数组长度,第三个参数用来接收返回的重复元素数组长度 int * duplicates(int[],int, int*); int main() { int arr[] = {3,5,6,5,9,5,10,11,3}; int n = sizeof(arr)/sizeof(arr[0]); int res_len = 0; int * resArray = duplicates(arr, n, &res_len); for (int i = 0; i < res_len; i++) { printf("%d \t", resArray[i]); } // 堆内存使用完必须手动释放,避免内存泄漏 free(resArray); return 0; } int * duplicates(int arr[], int n, int* res_len) { // 堆上分配数组,最大长度不可能超过原数组长度n int *tempArray = (int*)malloc(sizeof(int) * n); int r = 0; for (int i = 0; i < n; i++) { int flag = 0; // 先判断当前元素是不是已经加入过结果集 for(int k = 0; k < r; k++) { if(arr[i] == tempArray[k]) { flag = 1; break; } } if(flag) continue; // 再判断后续有没有重复元素 for (int j = i+1; j < n; j++) { if (arr[i] == arr[j]) { tempArray[r++] = arr[i]; break; } } } *res_len = r; return tempArray; }
方式2:外部传入预分配数组
由调用方提前分配好数组空间(栈、堆都可以),函数直接往传入的地址里写入结果,不需要管理内存分配:
#include <stdio.h> // 第三个参数是外部传入的结果数组地址,第四个参数接收结果长度 void duplicates(int[],int, int[], int*); int main() { int arr[] = {3,5,6,5,9,5,10,11,3}; int n = sizeof(arr)/sizeof(arr[0]); int resArray[n]; // 栈上预分配结果数组 int res_len = 0; duplicates(arr, n, resArray, &res_len); for (int i = 0; i < res_len; i++) { printf("%d \t", resArray[i]); } return 0; } void duplicates(int arr[], int n, int tempArray[], int* res_len) { int r = 0; for (int i = 0; i < n; i++) { int flag = 0; for(int k = 0; k < r; k++) { if(arr[i] == tempArray[k]) { flag = 1; break; } } if(flag) continue; for (int j = i+1; j < n; j++) { if (arr[i] == arr[j]) { tempArray[r++] = arr[i]; break; } } } *res_len = r; }
内容的提问来源于stack exchange,提问作者VenoM
相关产品推荐
相关产品推荐

