5

对不起,如果标题令人困惑。这是我的结构

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 个字节,因为它只是指针的大小,但是如何从structtypedef PhoneBook中找到实际结构的大小?

4

3 回答 3

7

您可以使用以下内容:

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

重要的问题是为什么上述有效,您不是对未定义行为指针执行间接寻址吗?不,你不是,因为除了可变长度数组之外根本不评估。如果我们查看C99 草案标准部分The sizeof operator2段说(强调我的):NULL sizeof6.5.3.4

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

此外,我们在第5段中看到以下示例,证实了这一解读:

double *dp = alloc(sizeof *dp);

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

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

这不会增加x

注意%zu是一个独立于平台的格式说明符,用于sizeof.

于 2013-10-30T02:53:36.720 回答
4

你可以做:

printf("%u\n", sizeof(*(PhoneBook) NULL) );
于 2013-10-30T02:34:34.667 回答
0

我会这样做:

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

那么您的电话簿是 struct l_list 的 typedef,而不是指针。这更有意义。PPhoneBook(或您选择的任何其他名称)是电话簿 * 的 typedef。

然后你可以这样做:

sizeof(PhoneBook)

它将为您提供正确大小的电话簿对象。

或者你可以这样做:

sizeof(PPhoneBook)

它将返回 4 个字节,即指针大小。请注意,隐藏您在非指针外观类型定义(例如 PPhoneBook)后面使用指针的事实并不总是可取的。它会使您的代码混乱。但是,如果这就是你想要的,这就是如何做到的!

于 2013-10-30T02:35:08.207 回答