使用malloc

时间:2015-08-16 08:24:52

标签: c memory memory-management struct malloc

我试图理解C中的结构的内存分配,但我坚持下去。

struct Person {
    char *name;
    int age;
    int height;
    int weight;
};
struct Person *Person_create(char *name, int age, int height, int weight)
{
    struct Person *who = malloc(sizeof(struct Person));
    assert(who != NULL);

    who->age = age;
    who->height = height;
    who->weight = weight;
    who->name = strdup(name);

    return who;
}
int main(int argc, char *argv[])
{
    struct Person *joe = Person_create("ABC", 10, 170, 60);
    printf("Size of joe: %d\n", sizeof(*joe));
    printf("1. Address of joe \t= %x\n", joe);
    printf("2. Address of Age \t= %x\n", &joe->age);
    printf("3. Address of Height \t= %x\n", &joe->height);
    printf("4. Address of Weight \t= %x\n", &joe->weight);
    printf("5. Address of name \t= %x\n", joe->name);
...

我不明白的是这个结构的内存分配。在我的打印输出上,我看到了:

Size of joe: 24
1. Address of joe   = 602010
2. Address of Age   = 602018
3. Address of Height    = 60201c
4. Address of Weight    = 602020
5. Address of name  = 602030

问题:

  • 为什么1和2之间存在差距?
  • 为什么4和5之间存在差距?
  • *name的大小如何计算为名称仅指向 第一个炭?

2 个答案:

答案 0 :(得分:0)

这是由于称为数据对齐的东西。引用this website

  

C / C ++中的每种数据类型都有对齐要求(实际上它是由处理器架构强制要求,而不是语言要求)。

然后扩展结构的这个要求:

  

由于各种数据类型的对齐要求,结构的每个成员都应该自然对齐。

您可以查看this文章,详细阅读..

答案 1 :(得分:-2)

结构的内存布局取决于机器,因此除非您尝试实现DBMS或设备驱动程序或类似内容,否则不应该为此烦恼。

sizeof(*name)等于sizeof(char),我不会在这里弄到你的困惑,你能给出进一步的解释吗?