我试图找出结构变量的大小。按照代码的sizeof结构应为28,但结果显示为8,并且名称被赋予20个以上的字符,但打印效果很好。我无法理解这种行为,有人可以帮我吗?
我使用DevC ++编译我的C代码。
pets = {'sparky': {
'kind': 'dog',
'owner': 'oh',
}, 'draggy': {
'kind': 'dragon',
'owner': 'harry',
}, 'thunder': {
'kind': 'lightning',
'owner': 'thor',
}}
for pet in pets:
print(pet)
我希望“结构尺寸”的输出为28,但实际输出为8。
答案 0 :(得分:1)
s
没有类型S
。它的类型为S *
,即它是一个指针,所以sizeof(s)
是系统上结构指针的大小。
如果要打印结构的大小,则需要打印sizeof(S)
或sizeof(*s)
。
此外,您使用了错误的格式说明符来打印sizeof
的结果。您当前在每个%d
调用中都使用printf
,而%zu
的正确格式说明符是sizeof
。
答案 1 :(得分:0)
这是我的观察,首先在这里
S *s=(S *)malloc(sizeof(S));
内存分配给s
,它是结构S
的指针,并且打印sizeof(s)
不会导致整个结构的大小,它只会打印结构的大小指针。
如果要打印完整结构的尺寸,请使用
sizeof(S)
或sizeof(*s)
。
其次,使用%d
格式说明符打印sizeof()
运算符结果会导致未定义的行为。使用%zu
。对于例如
printf("Size of structure is %zu \n",sizeof(*s));
也在这里
strcpy(s->name,"abcdefghijklmnopqrstuvwxyzffjfjfzdabcdefg");
s->name
只能包含20
个字符,包括终止\0
个字符,并且复制多于size
个字符会导致不确定的行为。由于C
不执行数组边界检查,因此,这并不意味着应该编写访问绑定数据之外的代码。