假设我具有以下结构:
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
告诉您,持有一个参数类型的实例需要多少个字符。