在没有创建对象的情况下从指针中查找结构的正确大小?

时间:2013-10-30 02:29:45

标签: c pointers struct sizeof

很抱歉,标题令人困惑。这是我的 struct

struct l_list{
   int number;
   char *name;
   double value;
   struct l_list *next;
};

typedef struct l_list *PhoneBook;

主要功能:

int main(void){

   printf("%u\n", sizeof(struct l_list));

   PhoneBook person1;

   printf("%u\n", sizeof(*person1));
   printf("%u\n", sizeof(PhoneBook));

   return 0;
}

输出结果为:

  

20
    20个
    4

我知道PhoneBook显示4个字节,因为它只是指针的大小,但是如何从中找到实际 struct 的大小typedef PhoneBook

3 个答案:

答案 0 :(得分:5)

您可以使用以下内容:

printf("%zu\n", sizeof( *(PhoneBook)NULL ) );

重要的问题是,为什么上述有效,您是不是在NULL 指针上执行间接,这将是undefined behavior?不,你不是因为sizeof除了variable length arrays之外根本没有评估。如果我们查看C99 draft standard部分6.5.3.4 sizeof运算符 2 表示(强调我的):

  

sizeof运算符产生其操作数的大小(以字节为单位),可以是   表达式或类型的括号名称。大小由类型确定   操作数。结果是整数。 如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是整数常量。

此外,我们在段落 5 中看到以下示例,其中确认了此读数:

double *dp = alloc(sizeof *dp);

在编译时,确定表达式的类型以便计算结果。我们可以通过以下示例进一步证明这一点:

int x = 0 ;
printf("%zu\n", sizeof( x++ ));

不会增加x

注意%zusizeof结果的platform independent格式说明符。

答案 1 :(得分:4)

你可以这样做:

printf("%u\n", sizeof(*(PhoneBook) NULL) );

答案 2 :(得分:0)

我会这样做:

typedef struct l_list{
    int number;
    char *name;
    double value;
   struct l_list *next;
} PhoneBook, *PPhoneBook;

然后你的PhoneBook是struct l_list的typedef,而不是指针。这更有意义。 PPhoneBook(或您选择的任何其他名称)是Phonebook *的typedef。

然后你可以这样做:

sizeof(PhoneBook)

它将为您提供正确的PhoneBook对象大小。

或者你可以这样做:

sizeof(PPhoneBook)

它将返回4个字节,指针大小。请注意,隐藏在非指针式typedef(例如PPhoneBook)后面使用指针的事实并不总是可取的。它可能会使您的代码混乱。但是,如果那就是你想要的,那就是怎么做的!