C - float** 函数参数不传递值

标签 c pointers initialization parameter-passing

我将一个矩阵作为 float** 指针传递给一个函数,该函数所做的唯一事情就是打印指针指向的矩阵中的元素。然而,print语句中的元素全部为0。我怀疑我是否正确初始化了指针 xadjm。

#include <stdio.h>
#include <stdlib.h>

void which(float **adj_mat, int n) {
  for (int tt=0; tt<n; tt++) {
    for (int cc=0; cc<n; cc++) {
      if (cc==(n-1)) {
        printf("%f-\n", *(adj_mat+tt*n+cc));
      } else {
        printf("%f-", *(adj_mat+tt*n+cc));
      }
    }
  }
}


int main() {
  int n=5;
  float adjm[5][5] = {{0.0, 1.0, 1.0, 0.0, 0.0}, {1.0, 0.0, 0.0, 1.0, 0.0}, {1.0, 0.0, 0.0, 1.0, 0.0}, {0.0, 1.0, 1.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0, 0.0}};
  float **xadjm = (float**) adjm;
  which(xadjm, n);

  return(0);
}

执行代码的输出:

0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-

最佳答案

您执行的转换无效。

您正在尝试将 float[5][5] 转换为 float **。虽然数组确实衰减为指向其第一个元素的指针,但适用于最外层数组维度。它不适用于内部尺寸。

但是,您可以做的是将参数列表中的数组维度指定为 which:

void which(int n, float adj_mat[n][n]) {

然后你可以这样调用它:

which(n, adjm);

您的打印也不正确:

  if (cc==(n-1)) {
    printf("%f-\n", *(adj_mat+tt*n+cc));
  } else {
    printf("%f-", *(adj_mat+tt*n+cc));
  }

表达式*(adj_mat+tt*n+cc)为您提供一个float *,而不是float。相反,请执行以下操作:

  if (cc==(n-1)) {
    printf("%f-\n", adj_mat[tt][cc]);
  } else {
    printf("%f-", adj_mat[tt][cc]);
  }

关于C - float** 函数参数不传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52784724/

相关文章:

c - 在 Dev-c++ 和 gcc 4.8.2 中编译时,同一程序获得不同的输出

c - 如何正确使用strncpy?

socket() 能否因 EINPROGRESS 而失败

c++ - 检查 C++ 中的指针定义

java - 导入扫描仪时必须声明一个命名包

c - C中 float 的准确精度

java - 等式 Java 数组中的奇怪之处 : References vs. 指针

c++ - 此 C++ 代码示例中是否存在关于指针的内存泄漏?

c - 在 C 中使用数组 [100] 时出现运行时错误

c - 初始化 C 结构预期的表达式