0

私はヘッダーファイルで定義されたこの構造を持っています:

struct params
{
    size_t s;       
    float  f1;        
    float  f2;   
    int    i1;   
    float  f3;    
    gsl_matrix_float *gm;
};

配列と別の配列を次のように初期化gsl_matrix_floatします。

gsl_matrix_float *another_gsl_matrix;
struct params p;

要素は 1 つずつ埋められます。たとえば、

p.s=1;p.f1=0.2f;

プログラム中に、まったく関係のない機能another_gsl_matrixが実行されます。しかし、その関数の後、 の値は!にp.s変わります。0奇妙なこと (私にとっては、知識が不足しているためだと思います!) は、構造体のメンバーの宣言の順序を変更すると (sたとえば、構造体宣言の 2 番目またはその他の位置に移動する) ことです。 ) もう問題はなく、すべての値に問題はありません! したがって、たとえば、その関数中に配列の外側を指すなど、メモリの管理ミスが原因ではないと思います。

ここで何が起こっているのかを理解するのを手伝ってくれたら、とても感謝しています!

4

1 に答える 1

3

何かがあなたの構造を壊しています。

ただし、その中でメンバーを移動すると、上書きされたときに他のコードに影響を与えないパディング バイトが導入される可能性が非常に高くなります。

C 実装では、配置の問題を考慮して、メンバー間の構造体と最終メンバーの後にパディングを自由に挿入できます。たとえば、次のような結果になる場合があります。

struct xyzzy {
    double zorkmid;   // offset 0, 8 bytes
    char   twisty;    // offset 8, 1 byte
                      // offset 9, 3 bytes padding
    int    plugh;     // offset 12, 4 bytes
    int    grue;      // offset 16, 4 bytes
                      // offset 20, 4 bytes padding.
                      // offset 24 for next zorkmid
};

メンバー間のパディング(決して先頭ではない) は、通常int、4 バイト境界に配置するなど、そのポイントに続くメンバーを整列させるためのものです。最後のメンバーののパディングは、通常、8 バイト境界に配置するなど、配列の状況で最初のメンバーの配置を確保するためです。double

ただし、解決策は、データを破損している原因を見つけて修正することです。

于 2013-08-02T04:08:17.637 に答える