私は現在、以下のようにCで新しいString構造体を作成しており、ポインタ演算を練習中です。構造体を使ったCのポインタ演算
struct String {
uint32_t check;
uint32_t capacity;
uint32_t length;
char data[1];
} String;
と私はどのように私のSTRINGマクロ作品を理解し、それが正常に動作しますが、私は私のif文がない理由はかなりわからないコード
define STRING(s) ((String*)(s - 3*sizeof(uint32_t)))
void utstrfree(char* self) {
// if(*(self - sizeof(uint32_t) * 3) == SIGNATURE) WHY DOES THIS NOT >WORK?
assert((STRING(self)->check) == SIGNATURE); //check if it's a >utstring
free(self-sizeof(uint32_t) * 3); //properly free the malloc and alternative could have been free(STRING(self))
}
のこの部分で少し混乱していました作業。誰も私にこれを説明することはできますか?
トピックを外してください:現代スタンダードCでは、このマジックリサイズ 'struct'トリックコーシャーですか? – user4581301
@ user4581301現代Cは、charデータ[1];ではなく、柔軟な配列メンバ - char data []; 'を使用する必要があります。そうでなければ、char *魚のような、しかし、非常にタイプセーフではない)。 – PSkocik
いいえ、@ user4581301、それ以前の標準ではそれほど正気ではありませんでしたが、実際は通常は動作します*。最近の標準では、[柔軟な配列メンバー](http://port70.net/~nsz/c/c11/n1570.html#6.7.2.1p18)を介してこのようなことを直接サポートしています。 –