如何在C++中从函数获取两个不同数据类型的数组?
问题解答
首先明确:你给出的代码完全不可行,核心问题集中在这几点:
- 局部数组的生命周期失效:
fun()里的array和array2是栈上的局部变量,函数执行完毕后,这块内存会被系统回收,返回它们的指针(数组名会隐式转为首元素指针)得到的是野指针,后续访问会触发未定义行为。 - 函数无法返回多个值:C语言函数只能返回单个值,你写的
return array,array2;是逗号表达式,实际只会返回array2的地址,而且类型是char*,和main里的int array1类型不匹配,编译直接报错。 - 数组不能直接赋值:数组名是常量指针,不能用
=直接赋值,array1=fun();这种写法本身就不符合C语法,编译阶段就会报错。
正确实现方法
方法1:通过指针参数传递,让函数填充数组内容
把main里已分配好内存的数组指针传给函数,函数直接往目标数组里写入数据,彻底避免局部数组销毁的问题:
#include <string.h> void fun(int *int_arr, char *char_arr) { // 给int数组赋值 int temp_int[] = {1,2,3,4}; memcpy(int_arr, temp_int, sizeof(temp_int)); // 给char数组赋值 char temp_char[] = {'a','b','c'}; memcpy(char_arr, temp_char, sizeof(temp_char)); } int main(){ int array1[4]; char array2[3]; // 传入数组指针,函数直接填充数据 fun(array1, array2); // 此时可正常使用array1和array2 return 0; }
方法2:用结构体封装两个数组,函数返回结构体
结构体可以容纳不同类型的数组,函数直接返回整个结构体(当前数组规模较小,不会触发栈溢出):
#include <string.h> // 定义包含两个数组的结构体 typedef struct { int int_arr[4]; char char_arr[3]; } ArrayBundle; ArrayBundle fun() { ArrayBundle bundle; // 赋值int数组 int temp_int[] = {1,2,3,4}; memcpy(bundle.int_arr, temp_int, sizeof(temp_int)); // 赋值char数组 char temp_char[] = {'a','b','c'}; memcpy(bundle.char_arr, temp_char, sizeof(temp_char)); return bundle; } int main(){ ArrayBundle data = fun(); // 使用data.int_arr和data.char_arr即可 return 0; }
方法3:使用静态数组(不推荐频繁使用)
把函数里的数组声明为static,使其生命周期覆盖整个程序运行期,返回的指针不会失效,但静态数组是全局共享的,多次调用函数会覆盖之前的数据,线程不安全:
#include <string.h> void fun(int **int_ptr, char **char_ptr) { static int array[4] = {1,2,3,4}; static char array2[3] = {'a','b','c'}; *int_ptr = array; *char_ptr = array2; } int main(){ int *array1; char *array2; fun(&array1, &array2); // 可使用array1和array2,但注意不要修改静态数组内容(后续调用fun会覆盖) return 0; }
内容的提问来源于stack exchange,提问作者Black Kite
相关产品推荐
相关产品推荐

