35

error: flexible array member not at end of structmallocを呼び出すと、なぜエラーが発生し続けるのか疑問に思います。可変長配列の構造体があり、このエラーが発生し続けます。

構造体は、

typedef struct {
  size_t N;
  double data[];
  int label[];
} s_col; 

そしてmallocへの呼び出しは、

col = malloc(sizeof(s_col) + lc * (sizeof(double) + sizeof(int)));

これはmallocへの正しい呼び出しですか?

4

3 に答える 3

34

構造体に含めることができる柔軟な配列メンバーは1つだけであり、常に構造体の最後のメンバーである必要があります。言い換えると、この場合、を呼び出す前に間違っていたため、この構造体を正しくmalloc呼び出す方法は実際にはありません。malloc

やりたいと思われること(同じ数のメンバーの配列datalabelを実行するには、次のようなことを検討できます。

struct my_pair { 
    double data;
    int label;
};

typedef struct { 
   size_t N;
   struct my_pair data_label[];
};

ただし、これは多少異なることに注意してください。sの配列の後にdoublesの配列が続く代わりに、 int1の配列の後に1doubleが続きint、次に次double、次intのようになります。これが同じに十分近いかどうかは、データの使用方法によって異なります(たとえば、連続した配列を期待する外部関数に渡す場合は、おそらく別の方法で行う必要があります)。

于 2012-06-24T19:08:05.483 に答える
12

構造体の定義と構造体の先頭へのポインターが与えられた場合、Cコンパイラーは、他に何もアクセスせずに、構造体の任意のメンバーにアクセスできる必要があります。構造内の各アイテムの位置は、その前にあるアイテムの数とタイプによって決定されるため、任意のアイテムにアクセスするには、前にあるすべてのアイテムの数とタイプを知っている必要があります。最後のアイテムが配列である特定のケースでは、配列内のアイテムにアクセスするには、どこから開始するかを知る必要があるため、これは特に問題にはなりません(先行する数とタイプを知る必要があります)。配列自体の項目数ではなく、項目)、および項目インデックス(コンパイラーは、配列のサイズについて何も知らなくても、スペースが存在する項目の数よりも小さいと見なす場合があります)。ただし、Flexible Array Memberが構造体の末尾以外の場所に表示された場合、それに続くアイテムの場所は、配列内のアイテムの数によって異なります。コンパイラーはこれを認識しません。

于 2013-12-02T19:23:33.523 に答える
4
typedef struct {
  size_t N;
  double data[];
  int label[];
} s_col; 

double data[]中央に柔軟な配列メンバー()を含めることはできません。ハードコードされた配列サイズを検討するかdouble *data

于 2012-06-24T19:09:15.717 に答える