C语言代码报错:invalid operands to binary * (double与double*运算)求助
解决C语言中"invalid operands to binary *"类型不匹配错误
首先看你遇到的报错:
invalid operands to binary * (have 'double' and 'double *')
这个错误直接指向你mat_y函数里的c[i] -= l[i][j] * c[j];这一行,我们来拆解下问题根源:
错误原因分析
从你的类型定义typedef double **mat;可以明确:mat是二维double数组的指针,也就是说:
l是mat类型,l[i][j]是一个具体的double数值(二维数组第i行第j列的元素)c也是mat类型,c[j]是一个double*指针(指向二维数组第j行的起始地址)
C语言不允许double和double*直接进行乘法运算,这就触发了类型不匹配的报错。另外,你前面的c[i] = b[i];也存在逻辑问题——这是把b的第i行指针直接赋值给c,不是复制元素,后续修改c会意外修改b的内存,这大概率不是你想要的行为。
从代码逻辑来看,这应该是求解下三角方程组的前向替换步骤,目标是计算一维向量y,问题核心是你误用了二维数组类型mat来表示一维向量。
两种修复方案
方案1:改用一维向量类型(推荐)
新增一维向量的类型和辅助函数,让代码逻辑更清晰直观:
// 新增一维向量的类型定义 typedef double* vec; // 创建一维向量的辅助函数 vec vec_new(int n) { return malloc(sizeof(double) * n); } // 修正后的mat_y函数 vec mat_y(mat b, mat l, int n) { vec c = vec_new(n); // 用局部变量替代全局变量,避免全局变量带来的意外副作用 int i, j; for(i = 0; i < n; i++) { // 假设b是n×1的矩阵,取每行第一个元素作为向量值 c[i] = b[i][0]; for(j = 0; j < i; j++) { c[i] -= l[i][j] * c[j]; } } return c; }
方案2:保持mat类型,修正元素访问(如果必须用二维数组)
如果你确实需要c是n×1的二维矩阵,那就要修改元素的访问方式,直接操作矩阵的列元素:
mat mat_y(mat b, mat l, int n) { mat c = mat_new(n); int i, j; // 改用局部变量 for(i = 0; i < n; i++) { // 复制b的第i行第0列元素到c对应位置 c[i][0] = b[i][0]; for(j = 0; j < i; j++) { c[i][0] -= l[i][j] * c[j][0]; } } return c; }
额外建议
- 尽量避免使用全局变量
i,j,k,在函数内声明局部变量可以减少意外的逻辑错误。 - 记得在使用完动态分配的内存后及时释放:比如
vec类型的内存用free(c);mat类型的内存要先free(c[0]),再free(c),避免内存泄漏。
内容的提问来源于stack exchange,提问作者Elif Sahin
相关产品推荐
相关产品推荐

