为什么 sizeof 打印 8 而不是 12

时间:2021-07-19 03:39:50

标签: c memory sizeof

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

#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);
    }
}

1 个答案:

答案 0 :(得分:3)

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

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

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

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