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

传递数组作为参数时函数调用失效的原因排查

代码核心问题分析与修复方案

核心问题拆解

1. 局部数组返回导致非法内存访问

createArray和multiplication中的二维数组都是栈上的局部变量,函数执行完毕后栈帧会被销毁,这些数组的内存会被系统回收。返回它们的地址属于返回无效内存,后续访问会触发未定义行为(比如程序无响应、输出乱码、崩溃)。而且函数返回类型是int,却返回数组指针,类型完全不匹配,编译器通常会给出警告。

2. 变量类型不匹配导致参数传递错误

main里的arr1、arr2、arr3是int类型,并非二维数组或指针。用它们接收createArray返回的地址,相当于把指针值强转为int,再把这个int值传给multiplication当作二维数组指针使用,这会导致函数接收到错误的内存地址,自然无法正确执行逻辑。

3. 未初始化变量引发计算错误

multiplication里的arr3未初始化就执行arr3[i][j] += ...操作,会累加内存中的垃圾值,最终结果完全错误。

修复方案

推荐在main中提前创建数组,传给函数填充或计算,避免返回局部内存的问题,以下是修正后的代码:

修正后的代码

#include <stdio.h>

// 接收已创建的数组,直接填充数据
void createArray(int arr[][10], int size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            printf("Enter value of position row %d , column %d: ", i + 1, j + 1);
            scanf("%d", &arr[i][j]);
        }
    }
}

// 传入输入数组与结果数组,直接完成矩阵乘法计算
void multiplication(int arr1[][10], int arr2[][10], int arr3[][10], int size)
{
    // 初始化结果数组为0,避免垃圾值干扰
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            arr3[i][j] = 0;
        }
    }
    
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            for (int k = 0; k < size; k++)
            {
                arr3[i][j] += arr1[i][k] * arr2[k][j];
            }
        }
    }
    printf("hello\n");
}

void display(int arr[][10], int size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    int size;
    printf("Enter size of the matrix:  ");
    scanf("%d", &size);
    
    // 在main栈上创建固定大小的二维数组(上限10x10,可按需调整)
    int arr1[10][10], arr2[10][10], arr3[10][10];
    
    createArray(arr1, size);
    createArray(arr2, size);
    multiplication(arr1, arr2, arr3, size);
    
    printf("\nResult matrix:\n");
    display(arr3, size);
    
    return 0;
}

修复说明

  • 将createArray改为无返回值函数,直接操作main中创建的数组,避免返回局部内存的问题。
  • multiplication新增结果数组参数,提前初始化数组为0,确保乘法计算结果正确。
  • 修正原代码中错误的换行符写法,保证输出格式正常。

内容的提问来源于stack exchange,提问作者Bidyut Kr. Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:37:36