この構造のサイズは何ですか?なぜ?

次のプログラムは出力4を与えます。私はそれが8 sizeof(int)+ sizeof(unsigned int)

#include
#include
int main()
{
        struct node
        {
                int a;
                struct node * next;
        };
        struct node * p= (struct node *) malloc( sizeof( struct node));
        printf("%d", sizeof( p));
}
1
あなたは、オブジェクト自体の代わりにポインタのサイズを取っています。
追加された 著者 Mysticial,
int とポインタの大きさに違いがあるため、これを32ビットまたは64ビット用にコンパイルするかどうかを知ることも重要です。
追加された 著者 Raceimaztion,
int とポインタの大きさに違いがあるため、これを32ビットまたは64ビット用にコンパイルするかどうかを知ることも重要です。
追加された 著者 Raceimaztion,

6 答え

このコードでは、 p はポインタなので、ポインタのサイズ(コンパイラ/ OSの組み合わせでは明らかに4バイト)を表示しているだけです。構造体のサイズが必要な場合は、 sizeof(* p)を出力する必要があります。また、指摘したように、 size_t に "%d"を使用することは必ずしも機能しません( "%zu"は正しいですが、現実世界ではほとんどのコンパイラ/ OS上で%dが使用されます)。また、構造体のサイズが8であると仮定してはいけません。ポインタが大きかったり、コンパイラが何らかの方法で構造体を埋め込みまたは整列させたい場合があります。

2
追加された

このコードでは、 p はポインタなので、ポインタのサイズ(コンパイラ/ OSの組み合わせでは明らかに4バイト)を表示しているだけです。構造体のサイズが必要な場合は、 sizeof(* p)を出力する必要があります。また、指摘したように、 size_t に "%d"を使用することは必ずしも機能しません( "%zu"は正しいですが、現実世界ではほとんどのコンパイラ/ OS上で%dが使用されます)。また、構造体のサイズが8であると仮定してはいけません。ポインタが大きかったり、コンパイラが何らかの方法で構造体を埋め込みまたは整列させたい場合があります。

2
追加された

p is just a pointer. Its size depends on ABI, which is in your case 4.

1
追加された
あなたはそれがポインタのサイズであることは間違いありません。あなたはそのサイズが何であるかを仮定するのは間違っています。
追加された 著者 Genia S.,
いいえ、ポインタのサイズになります。これは、符号なしintのサイズでも、そうでなくてもかまいません。
追加された 著者 Lee Daniel Crocker,

p is just a pointer. Its size depends on ABI, which is in your case 4.

1
追加された
あなたはそれがポインタのサイズであることは間違いありません。あなたはそのサイズが何であるかを仮定するのは間違っています。
追加された 著者 Genia S.,
いいえ、ポインタのサイズになります。これは、符号なしintのサイズでも、そうでなくてもかまいません。
追加された 著者 Lee Daniel Crocker,

また、 printf()の呼び出しで間違った書式指定子を使用しているため、正しいという回答があります。代わりに%zu を使用してください。 sizeof()size_t 型のオブジェクトを生成します。

したがって、プログラムは定義されていない動作を呼び出すので、自由に行うことができます(そして印刷できます)。

1
追加された
要は、 sizeof(x)unsigned int を生成しないので、 size_t を生成します。ほとんどのシステムでは、それは unsigned int と同じですが、必須ではありません。 %d は恐ろしいことを引き起こすのに対し、%zusize_t の適切な書式指定子です。
追加された 著者 amalloy,
私はunsigned intをintに変換しても未定義の動作にはならないと考えています。それは8ビットシステムで-127のようなものに255のようなものを変換するかもしれません。確かに。未定義のビヘイビアのソースは非常に高く評価されます。
追加された 著者 Atmaram Shetye,

また、 printf()の呼び出しで間違った書式指定子を使用しているため、正しいという回答があります。代わりに%zu を使用してください。 sizeof()size_t 型のオブジェクトを生成します。

したがって、プログラムは定義されていない動作を呼び出すので、自由に行うことができます(そして印刷できます)。

1
追加された
要は、 sizeof(x)unsigned int を生成しないので、 size_t を生成します。ほとんどのシステムでは、それは unsigned int と同じですが、必須ではありません。 %d は恐ろしいことを引き起こすのに対し、%zusize_t の適切な書式指定子です。
追加された 著者 amalloy,
私はunsigned intをintに変換しても未定義の動作にはならないと考えています。それは8ビットシステムで-127のようなものに255のようなものを変換するかもしれません。確かに。未定義のビヘイビアのソースは非常に高く評価されます。
追加された 著者 Atmaram Shetye,