私たちには、構造ヘッダが最初のメンバとして存在する多くの異なる構造のデータがあるとします。ヘッダーと異なるブロブが、任意のサイズのものであるとします。 それからtrueまたはfalseは、構造体のいずれかへのポインタを反復すると仮定します構造体ヘッダポインタはその構造体の次のメンバのアドレスになりますか?このようなシナリオでは、Cデータの配置要件はどのようになっていますか?Cの次のデータブロブへのポインタを反復することは安全ですか?
編集:例えば、少なくとも私のシステムでは、ターゲットのポインタがオフセットされていることを示す作業コードでas suggested by Olafが更新されています。私の主な質問に対する答えが「偽」であることを意味しています。とにかく関連する回答ありがとう!もし(メモリアライメントの理由から、例えば、)のメンバー間にパディングが存在し得るようstruct
部材のアドレスをインクリメントすることは、次のメンバのアドレスを与えると仮定することができない一般的なケースで
#include <stdio.h>
struct Header {
char data_b;
};
struct Data {
struct Header header;
int data;
};
void *Header_skip(void *big_or_small) {
return (struct Header *)big_or_small + 1;
}
int main(int argc, char const *argv[]) {
struct Data x = { .data = 2 };
int *data = (int *)Header_skip(&x);
printf("Expected: %p\n", &x.data);
printf("Actual: %p\n", data);
printf("Offset: %lld\n", (long long)data - (long long)&x.data);
return 0;
}
いいえ、 'Header'フィールドは埋め込まれている可能性があるので、' any_struct + 1'はこのパディングの先頭を指します。 –
あなたが達成しようとしていることは明確ではありません。 [ask]を見て、[mcve]を提供してください。パディングなどを分けて、返されたポインタを 'Header' **や**型のヘッダ以外のものとして逆参照すると、そのアドレスに' Header'があると未定義の振る舞いを引き起こします。 – Olaf
@Olaf質問を更新しました、リンクありがとうございます! – skogshjort