结构如何分配内存?

时间:2018-12-30 13:28:14

标签: c

我试图找出结构变量的大小。按照代码的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。

2 个答案:

答案 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不执行数组边界检查,因此,这并不意味着应该编写访问绑定数据之外的代码。