-1

次のプログラムは出力 4 を与えます。私はそれが 8 sizeof(int) + sizeof(unsigned int) を出力すると思っていました。

#include<stdio.h>
#include<stdlib.h>
int main()
{
        struct node
        {
                int a;
                struct node * next;
        };
        struct node * p= (struct node *) malloc( sizeof( struct node));
        printf("%d", sizeof( p));
}
4

3 に答える 3

2

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

于 2013-06-23T06:28:42.490 に答える
1

そして正しい答え: への呼び出しで間違った書式指定子を使用しているため、出力があったとしても不確定ですprintf()%zu代わりに使用する必要がありました -sizeof()型のオブジェクトを生成しますsize_t

したがって、プログラムは未定義の動作を呼び出し、必要なことを自由に実行 (および出力) できます。

于 2013-06-23T06:30:10.570 に答える
1

p単なるポインターです。そのサイズは、あなたのケース4にある ABI によって異なります。

于 2013-06-23T06:28:05.753 に答える