2

そのため、2 つの個別の関数で使用できるように、3 次元の整数配列をグローバルに宣言しようとしています。

最初に、私はこれを試しました(solns3D配列の名前です):

static int*** solns;

しかし、トリプル ポインターsolnsは関数間で保持されますが、その中に配置する情報は保持されません。これにより、2 番目の関数が最初の関数が配置したデータにアクセスしようとすると、segfault が発生しますsolns

内部の情報が残るように、これをどのように宣言すればよいですか? 私はもう試した

static int solns[][][];

とりわけ、gccは私が試した他のものを好きではありません。

編集: 関数 1 のこのコード スニペットは、データを配列に配置します。

solns[k] = realloc(solns[k],sizeof(solns[k])/sizeof(int*)+sizeof(int*));
solns[k][l] = realloc(solns[k][l],sizeof(int)*4*sC);
    for(i=0;i<sC*4;i++)
    {
        solns[k][l][i] = row[i];
    }
    l++;

このスニペットは、関数 2 がそのデータを読み取ろうとする場所です。

if(solns[i][j][m*4+1]!=solns[i+1][n][m*4+2])
    break;

しかし、が指すデータは引き継がれないsolns[i]ため、その時点では null ポインターです。solns

4

2 に答える 2

3

この用語staticをグローバル スコープで使用する場合、そのオブジェクト/変数のインスタンスが各コンパイル ユニットに対してローカルであることを意味します。

これは、各.cppファイルが上記の変数の異なるバージョンを持つことを意味します。したがって、関数が 2 つの異なるファイルにある場合、機能しません。

これを修正するには、この変数をファイルで定義し、ヘッダー ファイル.cppで として宣言します。extern

于 2013-02-18T07:47:04.517 に答える
1

使用する場合static int ***solnsは、配列にメモリを割り当てる必要があります。その場合に割り当てられるのは、int **. 使用する場合はstatic int solns[][][]、次のようなサイズを指定する必要がありますstatic int solns[4][5][3]

于 2013-02-18T08:03:21.977 に答える