2

以下に示すように、2次元行列のすべての要素を5に等しくするmake5という単純な関数があります。

int make5(int r, int c, double **d)
{
  int i, j;

  for (i = 0; i < r; i++) {
    for (j = 0; j < c; j++) {
      d[i][j] = 5;
    }
  }

  return 0;
}

次の呼び出しを使用して、この関数をさまざまな行列で実行できるようにしたいと思います。

make5(2, 3, a);
make5(2, 4, b);

ここで、aとbは配列の配列へのポインターとして宣言されています。しかし、これを試してみると、セグメンテーション違反エラーが発生し続けます。make5を変更して、aとbの両方で実行できるようにするにはどうすればよいですか?

4

1 に答える 1

1

関数は問題なく動作します。メモリを誤って割り当てているか、関数に誤ったパラメータを渡している必要があります。

実例:

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

int make5(int r, int c, double **d)
{
  int i, j;

  for (i = 0; i < r; i++) {
    for (j = 0; j < c; j++) {
      d[i][j] = 5;
    }
  }

  return 0;
}

#define ROWS 4
#define COLS 3

int main(void)
{
  double** p = malloc(ROWS * sizeof(double*));
  int i, j;

  for (i = 0; i < ROWS; i++)
    p[i] = malloc(COLS * sizeof(double));

  for (i = 0; i < ROWS; i++)
    for (j = 0; j < COLS; j++)
      p[i][j] = 1;

  for (i = 0; i < ROWS; i++)
  {
    for (j = 0; j < COLS; j++)
      printf("%f ", p[i][j]);
    printf("\n");
  }

  make5(ROWS, COLS, p);

  for (i = 0; i < ROWS; i++)
  {
    for (j = 0; j < COLS; j++)
      printf("%f ", p[i][j]);
    printf("\n");
  }

  return 0;
}

出力(ideone):

1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 
5.000000 5.000000 5.000000 
5.000000 5.000000 5.000000 
5.000000 5.000000 5.000000 
5.000000 5.000000 5.000000 
于 2012-09-11T07:24:57.280 に答える