传递数组作为参数时函数调用失效的原因排查
代码核心问题分析与修复方案
核心问题拆解
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
相关产品推荐
相关产品推荐

