指针和结构类型的大小看似不一致的原因是什么?

BUG*_*BUG 6 c printf pointers sizeof

在我的机器上,相关的尺寸是:
sizeof(char) == 1,sizeof(int) == 4sizeof(char*) == 8

#include <stdio.h>
#include <stdlib.h>

typedef struct person{
    char *name;
    int age;
}Person;

int main()
{
    printf("sizeof(Person): %d\n", sizeof(Person)); //-> 16 bytes
    Person *person = (Person*)malloc(sizeof(Person));
    printf("sizeof(person): %d\n", sizeof(person)); //-> 8 bytes ( Why 8 and not 16? )

    char buffer[32];
    printf("sizeof(buffer): %d\n", sizeof(buffer)); //-> 32 bytes
    person -> name = (char*)malloc(sizeof(buffer));
    printf("sizeof(person->name): %d\n", sizeof(person->name)); //-> 8 bytes ( Why 8 and not 32? )

    return 0;
}

Run Code Online (Sandbox Code Playgroud)

我知道这是sizeof(Person) == 16因为填充,但我不明白以下内容。
如果sizeof(Person) == 16,为什么sizeof(person) == 8而不是 16?
如果sizeof(buffer) == 32,为什么sizeof(person->name) == 8而不是 32?

Puc*_*uck 6

因为, as sizeof(char *)sizeof(person)返回指针的大小。在您的情况下,指向结构的指针(此处指向 Person 结构)的大小为 8。

sizeof(person->name)返回name定义为 a的 char 上指针的大小char *

buffer不是指针,它是一个数组。编译器知道它并sizeof(buffer)返回数组的大小,即使数组的名称和指针之间存在一些相似之处,但它们的处理方式并不相同。


Vla*_*cow 3

对于初学者输出该类型的对象,size_t 您应使用转换说明符zu

printf("sizeof(Person): %zu\n", sizeof(Person));
                        ^^^   
Run Code Online (Sandbox Code Playgroud)

我不明白以下内容:如果 sizeof(Person) == 16,为什么 sizeof(person) == 8 而不是 16?

名称Person表示结构

typedef struct person{
    char *name;
    int age;
}Person;
Run Code Online (Sandbox Code Playgroud)

该类型的对象占用 16 个字节。

名称person声明如下

Person *person = (Person*)malloc(sizeof(Person));
Run Code Online (Sandbox Code Playgroud)

表示一个指针。该指针占用8个字节,指向为Person类型的对象分配的内存,占用16个字节。

That issizeof( Person )sizeof( Person * )that is equal tosizeof( person )是两个不同的表达方式。

如果 sizeof(buffer) == 32,为什么 sizeof(person->name) == 8 而不是 32?

同样,该名称name具有指针类型并占用 8 个字节。person它是声明如下的结构的数据成员

char *name;
Run Code Online (Sandbox Code Playgroud)

该指针指向动态分配的内存,占用32字节。

请注意,指针的大小并不取决于它是指向单个对象还是指向数组的第一个元素。也就是说,您可以为非常大的数组分配内存,但指向已分配内存的指针的大小不会根据已分配内存的大小而改变。

例如考虑

int a[10];

int *p = a;

int b[10000];

int *q = b;
Run Code Online (Sandbox Code Playgroud)

在此示例中,指针 p 和 q 具有相同的大小。例如你可以写

int a[10];

int *p = a;

int b[10000];

p = b;
Run Code Online (Sandbox Code Playgroud)

最后一次赋值后,指针的大小p不会改变。