【问题标题】:passing an array to a function -- what is going wrong?将数组传递给函数——出了什么问题?
【发布时间】:2015-11-13 18:27:11
【问题描述】:

这个 C 代码可能有一百个过时或低效的地方。但主要是,我只想知道为什么我在例程“jacobi_solve”中遇到段错误。驱动代码在这里:

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


int main() {
  int m=20, n=20;
  int i,j;
  double A[m][n],Anew[m][n];

  for (j=0;j<n;j++){
    for (i=0;i<m;i++){
      A[j][i] = 0.; Anew[j][i] = 0.;
    }
  }

  A[10][10] = 1.;
  printf("%x\n",A); 

  jacobi_solver(A,Anew,m,n);

}

jacobi_solver 在这里:

#include<stdio.h>
#include<math.h>

void jacobi_solver(double **A, double **Anew, int m, int n) {

  double err,tol=1.e-6;
  int iter=0,iter_max=100;
  int i,j;

  err = tol*10.;
  printf("hello\n");
  printf("%f %f %d %d\n",err,tol,iter,iter_max);
  printf("%x\n",A);
  printf("%f\n",A[10][10]);   /* <--- seg fault!  */
  printf("solving ...\n");

  while ( err > tol && iter < iter_max ) {

    for( j = 1; j < n-1; j++) {
      for( i = 1; i < m-1; i++) {
        Anew[j][i] = 0.25 * (A[j][i+1] + A[j][i-1] +
                             A[j-1][i] + A[j+1][i]);
        err = fmax(err, abs(Anew[j][i] - A[j][i]));
      }
    }

    printf("%f\n", err);

    for( j = 1; j < n-1; j++) {
      for( i = 1; i < m-1; i++ ) {
        A[j][i] = Anew[j][i];
      }
    }


    iter++;

  }

}

请注意,如果我删除 print 语句,稍后会在主求解循环中出现段错误。

【问题讨论】:

  • ** 是指向指针的指针,而不是指向二维数组的指针。
  • 这是我总是感到困惑的地方。我认为数组和指针几乎是一回事,然后我被告知它们不是。从来没有真正弄清楚差异。有什么好的参考吗?
  • 这里有一些很好的答案:stackoverflow.com/questions/1335786/…
  • jacobi_solver.c 文件的头文件在哪里(最好命名为 jacobi_solver.h)
  • 没有一个发布的代码可以干净地编译,即使两个文件合并。强烈建议在编译时,始终启用所有警告,然后修复警告。 (对于 gcc,至少使用:-Wall -Wextra -pedantic

标签: c arrays function segmentation-fault parameter-passing


【解决方案1】:

将求解器函数的界面更改为类似

void jacobi_solver(int m, int n, double A[n][m], double Anew[n][m]) {
  ...
}

一个二维数组应该就这样使用。特别是它不是一个指向向量的指针表,就像你拥有的那样。数组大小必须放在第一位,这样您就可以将它们用于数组参数。

这应该适用于至少符合 C99 的所有编译器。

【讨论】:

    【解决方案2】:

    代码不正确 - 您不能像在 C 中使用二维数组一样使用 double**(与 double* 和 1-D 数组不同,这有点令人困惑,但如果您了解内存的工作原理,则不会)。我建议您以

    中建议的方式之一实现自己的二维数组包装器

    How do I work with dynamic multi-dimensional arrays in C?

    【讨论】:

    • 那么有什么直接的方法可以将多维数组传递给函数吗?或者这些包装器是唯一的选择吗?谢谢。
    猜你喜欢
    • 2015-12-13
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2017-10-23
    相关资源
    最近更新 更多