假设我具有以下结构:

  typedef struct
  {
  int length ;
  int * data ;
  } Array ;


在主要功能中,我执行以下操作:

 int length = 10;
 char * filename = " data ";
 // create an object
 Array * arrptr1 = NULL ;
 printf (" sizeof ( arrptr1 ) = % d \ n ", ( int ) sizeof ( arrptr1 ));
 arrptr1 = malloc ( sizeof ( Array ));
 printf (" sizeof ( arrptr1 ) = %d , sizeof ( Array ) = % d \ n" ,
 ( int ) sizeof ( arrptr1 ) , ( int ) sizeof ( Array ));
 // allocate memory for the data
 arrptr1 -> length = length ;
 arrptr1 -> data = malloc ( sizeof ( int ) * ( arrptr1 -> length ));
 printf (" sizeof ( arrptr1 ) = %d , sizeof ( arrptr1 -> data ) = % d \ n " ,
 ( int ) sizeof ( arrptr1 ) , ( int ) sizeof ( arrptr1 -> data ));


每个打印语句将打印什么?

我知道对于第一次打印,sizeof(arrptr1)只是一个垃圾值。

对于第二次打印,sizeof(arrptr1) = 8和sizeof(Array) = 8也会吗?

第三个打印语句将输出什么?

最佳答案

我知道对于第一次打印,sizeof(arrptr1)只是一个垃圾值。


不,它将是指针的大小。例如,如果它是一个64位平台,其中所有指针均为8个字节,它将输出8。 ?


  对于第二个打印,sizeof(arrptr1)= 8以及sizeof(Array)= 8也会吗?


不见得。由于Array具有一个整数和一个指针,因此在具有8个字节的指针和4个字节的整数的平台上,它可能会增加16个字节。 (如果它是12个字节,则Array的数组将使所有其他元素未对齐。)


  第三个打印语句将输出什么?


认为sizeof关心您要询问的大小的东西是一个常见的初学者错误。它只是给出了相关类型的大小。

char * j;
sizeof(j);    // equivalent to sizeof(char*)
sizeof(*j);   // equivalent to sizeof(char)

j = "hello";
sizeof(j);    // still equivalent to sizeof(char*)
sizeof(*j);   // still equivalent to sizeof(char)

j = malloc(32);
sizeof(j);    // still equivalent to sizeof(char*)
sizeof(*j);   // still equivalent to sizeof(char)


您可以将sizeof告诉您,持有一个参数类型的实例需要多少个字符。

07-24 09:51
查看更多