#include <stdio.h>
struct test
{
int a;
char b;
int c;
};
int main()
{
struct test *ptr = (struct test *)0;
ptr++;
fprintf(stderr, "by pointer = %zd\n", (size_t) ptr);
fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test));
return 0;
}
0
A
答えて
2
ptr
は、が定義されていません。です。
(size_t)ptr
は、の実装がと定義されていることに注意してください。 size_tへのポインタをキャストするのは常に有効ですが、結果をsize_t型で表現できない場合、その動作は未定義です。
C標準ではポインタを0に設定できますが、ポインタの算術演算は配列内でのみ有効です。ただし、配列の末尾よりも1つ先に、またはスカラーのアドレスより先にポインタを置くことができます。 sizeof
タイプの正しい書式指定子が%zu
であることを
注 - 他には、あなたも多くの未定義の動作の可能性を持っています。
-1
ポインタのタイプは「struct test」です。これはここで起こっていることです。
1)「PTR」はポインタであるため、「PTR ++」は、構造体の試験のサイズによってメモリロケーションを増加させるであろうuは:)言うことができるメモリ位置「0」(NULLポインタ)
2)に割り当てられています構造体の型。したがって、アドレス "12"を指すようになりました。
3)sizeof(構造体)はパディングのために12を与えます。 (3バイトはchar変数に埋め込まれているので、9を与えるべきであるが、12を与えているように見える)
これで、少し変更することができます。
#include <stdio.h>
struct test
{
int a;
char b;
char d;
int c;
};
int main()
{
struct test A;
struct test *ptr = (struct test *)0;
ptr++;
fprintf(stderr, "by pointer = %zd\n", (size_t) ptr);
fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test));
ptr = &A;
fprintf(stderr, "by pointer = %zd\n", (size_t) ptr);
fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test));
return 0;
}
これはuが得られます出力されます。
by pointer = 12
by sizeof = 12
by pointer = 140737488347632
by sizeof = 12
私は
関連する問題
- 1. 構造体内部のポインタにアドレスを割り当てます。
- 2. sizeof構造体内構造体
- 3. 構造体へのポインタを持つ構造体:ベスト・アプローチ
- 4. C++構造体のポインタを持つ構造体を初期化するには、
- 5. Cポインタ演算はsizeof(構造体)
- 6. Segfault。構造体内の構造体にメモリを割り当てる
- 7. MATLABの構造体配列に構造体を割り当てる
- 8. 構造体にポインタを持つ構造体へのポインタの配列
- 9. Cの構造体をインラインに割り当てる方法は?
- 10. ビットフィールドを持つ構造体に値を割り当てる方法は?
- 11. ライティング/ Iは、以下の構造体を持っていると言うことができます構造体
- 12. 構造体のアドレスを他の構造体のポインタに代入する
- 13. C構造体へのポインタを持つ構造体 - 値にアクセスする
- 14. は動的に私が動的にメンバーとして別の構造体を持つ構造体を割り当てています構造体
- 15. 構造体にポインタを動的に割り当てた配列
- 16. 2次元配列のポインタを構造体に割り当てる方法
- 17. 構造体配列のアドレス指定とメモリの割り当て
- 18. C内の構造体を含む構造体のバイト割り当て
- 19. 構造体ポインタのメモリ割り当て配列を配列
- 20. 構造体変数のメモリを割り当てる方法
- 21. 構造体の配列を再割り当てする方法
- 22. C構造体の割り当て?
- 23. 構造体データの割り当て
- 24. ポインタで構造体内のリスト内の構造体にアクセスする方法は?
- 25. 構造体とポインタ
- 26. C構造体ポインタ - 構造体ポインタをモジュールから戻す方法は?
- 27. 構造体ポインタ型キャストエラーの割り当ては、キャスト
- 28. ポインタ構造体を持つSWIG関数
- 29. 異なる構造体内の構造体へのポインタ。 C
- 30. 私は、単純な構造体持っている構造体
それはウル疑問を明確に願っています質問は何ですか? – e0k
ポインターが0に割り当てられた場合、ポインターがない – samgak
ポインターのサイズであることが保証されているuintptr_tへのポインターを常にキャストすることが常にベストです。 'size_t'はそれに適合することが保証されていません –