很抱歉,标题令人困惑。这是我的 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
?
答案 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
。
注意:%zu
是sizeof
结果的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)后面使用指针的事实并不总是可取的。它可能会使您的代码混乱。但是,如果那就是你想要的,那就是怎么做的!