3

32 ビット マシン (GCC を使用) でのプログラムの出力はどうなりますか? 説明。

#include<stdio.h>

int main() {

     struct node {
         int data;
         struct node *link;
     };

     struct node *p, *q;
     p = (struct node *) malloc(sizeof(struct node));
     q = (struct node *) malloc(sizeof(struct node));
     printf("%d, %d\n", sizeof(p), sizeof(q));
     return 0;
}

出力が表示されます

4、4。

上記のプログラムは、構造体メンバーのアラインメントのパディングとデータのパッキングに関連していますか?

4

4 に答える 4

3

いいえ、ポインターのサイズを印刷しているだけです。構造体の内部メンバー レイアウトとは関係ありません。

于 2015-07-31T07:53:09.937 に答える
2
  • ポイント 1形式指定子を使用して、 type%zuの出力を出力します。sizeofsize_t

  • ポイント 2の型に注意してください。pstruct node *同じqです。

したがって、基本的に、sizeof(p)およびは、プラットフォーム上で 32 ビット幅の とsizeof(q)まったく同じです。ここでは変数sizeof(struct node *)を考慮していないため、この場合、構造体とメンバーの配置とパディングは関連も関係もありません。

そうは言っても、なぜand ファミリーの戻り値をにキャストしないのかを見てください。malloc()C

于 2015-07-31T07:59:43.083 に答える
2

32 ビット システムでは、保存されるアドレスは常に 32 ビットです。ポインターのサイズを出力している場合、基本的にはポインターが指すアドレスのサイズを出力しているだけです(32 Bit -> 4 Byte)

構造体のサイズを知りたい場合は、次のようにします。

struct node p;
struct node q = {4, &p};

printf("%zu, %zu\n", sizeof(p), sizeof(q));
于 2015-07-31T07:58:56.917 に答える
0

いいえ、構造体メンバーのアラインメント パディングとデータ パッキングには関係ありません。

32 ビット マシンであるため、ポインタのサイズは4バイトになります。p と q は型、struct node *つまり結果へのポインタであるため、ポインタとstruct nodeのサイズが出力されます。pq

于 2015-07-31T08:18:53.917 に答える