0
double **matrix = NULL;
matrix = (double **)malloc(sizeof(double *) * N);   // N is the size of the square matrix

for(int i=0; i<N; i++)
{
   matrix[i] = (double *)malloc(sizeof(double)*N);
}

// Works good up to the next part
for(int i=0; i<N; i++)
{
   for(int j=0; j<N; j++)
   {
      printf("Value: %f", matrix[i][j]);
   }
}

上記の方法を使用して double の 2 次元配列を作成しようとしています (ポインターの配列を作成し、各ポインターが double の配列を取得します)。ただし、最初の要素マトリックス [0] [0] を印刷しようとするとすぐに、セグ フォールトが発生します。私は自分のものを動作させることができないことを除いて、ほぼ同じことを行う他のいくつかの投稿を見てきました。

4

2 に答える 2

3

構文的には、コードに問題はありません。コード全体が表示されていないか、(可能性は低いですが) プログラムがメモリ不足で、malloc の結果を確認してそれを確認していません。

プログラムの設計上、断片化されたポインタからポインタへの構文は使用しないでください。隣接するメモリセルに割り当てられた1つの真の2D配列ではなく、ヒープ全体にN個の配列を作成します。ヒープの断片化はプログラムのパフォーマンスに悪影響を及ぼし、その他のさまざまな問題を引き起こす可能性があります (システムによって異なります)。

malloc の結果のキャストは、C では無意味です。古い C コンパイラでは、有害ですらあります。

配列の項目を印刷する前に値を与えません。それらをすべてゼロに設定するには、memset を使用するか、malloc を calloc に置き換えます。

上記の問題を修正し、コードを次のように書き直す必要があります。

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

double (*matrix)[N];  // an array pointer
matrix = calloc(1, sizeof(double[N][N])); // pointing at one true 2D array

if(matrix == NULL)
{
  // handle error
}


for(int i=0; i<N; i++)
{
  for(int j=0; j<N; j++)
  {
    printf("Value: %f", matrix[i][j]);
  }
}
于 2013-05-07T06:28:19.753 に答える
-3

こんにちは、私はこの c++ ファイルを持っています。g++ コンパイラで最後までうまく動作します。

#include <cstdio>
#include <cstdlib>

using namespace std;

int main(){
    int N = 10;
    double **matrix = NULL;
    matrix = (double **)malloc(sizeof(double *) * N);   // N is the size of the square matrix

    for(int i=0; i<N; i++)
    {
        matrix[i] = (double *)malloc(sizeof(double)*N);
    }

    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
        {
            printf("Value: %f", matrix[i][j]);
        }
    }
}
于 2013-05-07T05:56:28.990 に答える