C语言二维数组报assignment makes integer from pointer without a cast警告解决
警告触发原因
- 核心语法错误:C语言二维数组的元素访问语法为
数组名[行下标][列下标],你的代码中错误使用了my2DArray[row,col]的写法。此处逗号是C语言的逗号运算符,整个括号内的表达式最终取值为最后一个操作数col,相当于你实际写的是my2DArray[col],这个值是指向二维数组第col行的指针,你把指针直接加到int类型的累加变量上,就触发了「assignment makes integer from pointer without a cast」的警告。 - 附带逻辑错误:
findMeanLine、findMeanCol函数内定义的avgLine、avgCol是栈内存临时数组,函数执行结束后内存就会被回收,无法正常返回结果。- 函数返回值写为
avgLine[n]、avgCol[n]属于数组越界访问,变长数组avgLine[n]的合法下标范围是0到n-1。 - main函数中
avgLine[n] = findMeanLine(...)同样是越界访问,同时你原本需要获取所有行/列的平均值,用单个float作为返回值的设计完全不符合需求。
修复方案
- 修正所有二维数组元素访问的语法,把
my2DArray[row,col]全部替换为my2DArray[row][col] - 调整求行/列平均值的函数设计,把main中提前定义好的平均值数组作为参数传入函数直接填充,不需要返回值:
原函数声明修改为:void findMeanLine(int n ,int my2DArray[][n], float avgLine[]); void findMeanCol(int n ,int my2DArray[][n], float avgCol[]); - 对应修改函数实现:
void findMeanLine(int n ,int my2DArray[][n], float avgLine[]) { int sumRow=0; int row,col; for (row=0; row <n ; row++) { sumRow=0; for (col=0 ; col < n ; col++) { sumRow+=my2DArray[row][col]; } avgLine[row]=(float)sumRow/n; } } void findMeanCol(int n ,int my2DArray[][n], float avgCol[]) { int row,col; for (col=0 ; col < n ; col++) { int sumCol=0; for (row=0; row < n ; row++) { sumCol+=my2DArray[row][col]; } avgCol[col]=(float)sumCol/n; } } - 调整main函数中的调用逻辑,删除越界赋值的写法:
// 计算每行平均值 findMeanLine(n, my2DArray, avgLine); // 打印每行平均值 showPinDouble1D(n,avgLine); // 计算每列平均值 findMeanCol(n ,my2DArray, avgCol); // 打印每列平均值 showPinDouble1D(n,avgCol);
修改完成后重新编译即可消除警告,程序也能正常输出行列平均值和对角线求和结果。
内容的提问来源于stack exchange,提问作者Vasilis
相关产品推荐
相关产品推荐

