4

タイプがあると仮定しましょう:

typedef struct __BUFF_T__
{
    u_int8_t *buf;
    u_int32_t size;
}buff_t;

c99で次の方法でメモリを割り当てるのは正しいですか?

buff_t a = {.size = 20,.buf = calloc(a.size,1)};

コンパイラに警告が表示される

変数'data'は、それ自体の初期化内で使用されると初期化されません

メモリは利用可能ですべてですが、同じことを行うための他の非警告オプションはありますか?

4

2 に答える 2

4

6.7.9p23から:

初期化リスト式の評価は、相互に不確定に順序付けられます[...](152)特に、評価の順序は、サブオブジェクトの初期化の順序と同じである必要はありません。

したがってa.size、その時点で初期化されたものがcalloc(a.size, 1)の初期化について評価されるという保証はありませんa.buf

この場合、適切な初期化子は作成関数になります。

inline buff_t create_buff(u_int32_t size) {
  return (buff_t) {.size = size, .buf = calloc(size, 1)};
}
buff_t a = create_buff(20);

これは、静的オブジェクトまたはファイルスコープオブジェクトには使用できません。その場合、マクロが必要になります(または、たとえば、マクロで使用できるgccステートメント式)。

于 2013-02-01T21:16:41.113 に答える
3

式が評価される順序がわからないため、構造体は、の割り当てが完了するまで完全には初期化されません。a

構造体フィールドを使用して同じ構造体の別のフィールドを初期化する必要がある場合は、別の手順で行う必要があります。

于 2013-02-01T20:56:12.657 に答える