使用指针传递二维数组到函数时出现E0142与E0020错误
二维数组指针传递与赋值的错误排查
问题背景
尝试通过指针将两个二维数组传递到函数中,后续将传入的指针数组解引用后赋值给非指针数组以方便操作数据。未使用对象/类,无需动态内存处理(new、delete)。
主函数中的原始数组
int arr_fractions[2][7] { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; int arr_converted_values[2][7] { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0} };
主函数中的函数调用
arr_converted_values[2][7] = decimal_conversion(arr_decimals, *arr_converted_values, &var_fract_length);
函数定义
int decimal_conversion(long double* arr_temp_decimals, int* arr_converted_values, int* var_fract_length) { // pointer retrieval ---------------------------------------------------------------- long double arr_temp_decimals[2][7] { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; int arr_temp_values[2][7] { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; int var_tempt_fract_value = *var_fract_length; for (int* var_temp_storage = 0; *var_temp_storage < *var_fract_length; *var_temp_storage++) { arr_temp_decimals[0][*var_temp_storage] = &arr_decimals[0][*var_temp_storage]; arr_temp_decimals[1][*var_temp_storage] = &arr_decimals[1][*var_temp_storage]; arr_temp_values[0][*var_temp_storage] = arr_converted_values[0][var_temp_storage]; arr_temp_values[1][*var_temp_storage] = arr_converted_values[1][var_temp_storage]; } // -------------------------------------------------------------------------------------------- ... ... ... return (*arr_converted_values); }
当前报错
- E0142: 表达式必须具有指向对象的指针类型,但它的类型为
long double--> 对应arr_temp_decimals[0][*var_temp_storage] - E0142: 表达式必须具有指向对象的指针类型,但它的类型为
long double--> 对应arr_temp_decimals[1][*var_temp_storage] - E0020: 标识符 "arr_decimals" 未定义 --> 对应
&arr_decimals[0][*var_temp_storage]
错误原因与修复方案
1. 标识符未定义问题
函数内使用的arr_decimals既不是函数参数,也不是全局变量,编译器无法找到它。主函数调用时传递的第一个参数是arr_decimals,但函数参数名是arr_temp_decimals,需将函数内的arr_decimals替换为参数名arr_temp_decimals。
2. 指针类型不匹配与赋值错误
- 你试图把
&arr_decimals[0][*var_temp_storage](long double*类型的地址)赋值给arr_temp_decimals[0][*var_temp_storage](long double类型的数值变量),类型完全不匹配,这是E0142错误的核心原因。应直接赋值数组元素的数值,而非地址。 - 函数参数声明错误:传递二维数组时,不能用一维指针
long double*或int*,正确的声明应为long double arr_temp_decimals[2][7]或long double (*arr_temp_decimals)[7](后者更通用),int* arr_converted_values同理需修正为二维数组参数类型。
3. for循环的指针滥用
用int* var_temp_storage = 0并解引用作为循环变量是非法操作——空指针解引用会触发未定义行为。直接使用普通int变量作为索引即可。
修复后的代码示例
修正后的函数定义
// 正确声明二维数组参数 int decimal_conversion(long double arr_temp_decimals[2][7], int arr_converted_values[2][7], int* var_fract_length) { long double arr_temp_decimals_local[2][7] = {0}; int arr_temp_values[2][7] = {0}; int fract_length = *var_fract_length; // 用普通int变量作为循环索引 for (int idx = 0; idx < fract_length; idx++) { // 直接赋值数组元素数值 arr_temp_decimals_local[0][idx] = arr_temp_decimals[0][idx]; arr_temp_decimals_local[1][idx] = arr_temp_decimals[1][idx]; // 正确访问传入的二维数组元素 arr_temp_values[0][idx] = arr_converted_values[0][idx]; arr_temp_values[1][idx] = arr_converted_values[1][idx]; } // ... 后续业务逻辑 // 返回值建议改为合理的状态码或计算结果,当前返回*arr_converted_values无实际意义 return 0; }
修正后的主函数调用
// 直接传递数组名,数组会自动退化为指向首元素的指针,匹配参数类型 decimal_conversion(arr_decimals, arr_converted_values, &var_fract_length); // 注意:不要给arr_converted_values[2][7]赋值,该下标越界(数组下标从0开始,2行7列的数组最大下标为[1][6])
内容的提问来源于stack exchange,提问作者Retro Epiphany
相关产品推荐
相关产品推荐

