You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针传递二维数组到函数时出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:50:35