为什么 sizeof 打印的是 8 而不是 12

why sizeof is printing 8 instead of 12

我正在做一个简单的结构程序,为 struct.name 分配了 12 个字符的内存(第 14 行),但是 sizeof(p[i].name) 的打印(第 32 行)正在显示8 而不是 12。为什么要这样做 that?

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

typedef struct person{
    char *name;
    uint32_t age; 
}person_;
int main()
{
    person_ p[3];
    uint32_t i,j;
    for(i = 0;i<3;i++){
        p[i].name = malloc(sizeof(char) * 12);
        if(p[i].name == NULL){
            fprintf(stderr,"Error allocating memory\n");
            for(j = 0;j<i;j++){
                free(p[i].name);
            }
            exit(1);
        }
    }

    for(i = 0;i<3;i++){
        if(fgets(p[i].name,sizeof(p[i].name),stdin) == NULL){
            fprintf(stderr,"Error reading string\n");
            exit(2);
        }
    }
    for(i = 0;i<3;i++){
        printf("%s",p[i].name);
        printf("sizeof(%d)",sizeof(p[i].name));
    }

    for(j = 0;j<3;j++){
        free(p[j].name);
    }
}

嗯,p[i].name 是一个 char *,即指向字符的指针。指向您平台上字符的指针的大小为 8 个字符。所以 sizeof(p[i].name) returns 8.

请注意,对象的大小与其值无关。因此 p[i].name 指向其中有 12 个字符的某个地方对 p[i].name 本身的大小没有影响。

想想如果 p[i].name = NULL; 改变了 p[i].namesize 会有多奇怪。这 12 个字符的大小仍然相同,p[i].name 仍然有四个字符包含 NULL.

当你为一个对象分配 space 时,你在知道它的值之前就这样做了。所以大小不能取决于值。