C 为什么结构的大小不同于结构指针的大小

C 为什么结构的大小不同于结构指针的大小,c,C,下面是我的代码,解释了为什么结构的大小不同于结构指针的大小 #include<stdio.h> #include<string.h> #include<stdlib.h> struct flx { int age; int id; char name[]; }*s; int main() { char name[50]="Hi how are you"; s=malloc(sizeof(s)+sizeof(char)*

下面是我的代码,解释了为什么结构的大小不同于结构指针的大小

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

struct flx
{
    int age;
    int id;
    char name[];
}*s;


int main()
{
   char name[50]="Hi how are you";
   s=malloc(sizeof(s)+sizeof(char)*strlen(name));
   s->id=12345;
   s->age=16;
   strcpy((*s).name,name);
   printf("Id --- %d\nName --- %s\n age --- %d",s->id,s->name,s->age);
   printf("\nTotal Sizeof *s is %d \nSize of s is 
   %d",sizeof(*s),sizeof(s));
   return 0;
}

output:(In code::blocks)
Id --- 12345
Name --- Hi how are you
age --- 16
Total Sizeof *s is 8
Size of s is 4
Process returned 0 (0x0)   execution time : 0.473 s
Press any key to continue.

那么,为什么sizeof结构显示不同的大小,以及显示“s的大小为4”的原因是什么呢?

一个结构、一个
int
、一个指向结构的指针和一个指向
int
的指针都是不同的类型。没有理由它们必须是相同的大小

在许多C实现中,指向结构的指针的大小与指向
int
的指针的大小相同,但这不是C标准所要求的

在许多实现中,指针的大小与
int
相同,因为两者都受到目标处理器体系结构特性的影响,但C标准并不要求这样做


然而,结构的大小差别很大,因为它们的大小取决于它们的内容。相反,指向结构的指针的大小并不取决于结构的内容,就像房屋的邮政地址的长度取决于房屋的大小或内容一样。

结构、
int
、指向结构的指针和指向
int
的指针都是不同的类型。没有理由它们必须是相同的大小

在许多C实现中,指向结构的指针的大小与指向
int
的指针的大小相同,但这不是C标准所要求的

在许多实现中,指针的大小与
int
相同,因为两者都受到目标处理器体系结构特性的影响,但C标准并不要求这样做


然而,结构的大小差别很大,因为它们的大小取决于它们的内容。相反,指向结构的指针的大小并不取决于结构的内容,就像房屋的邮政地址的长度取决于房屋的大小或内容一样。

指针几乎总是与其指向的数据大小不同,原因很简单,也很根本,指针是不同的(与它所指向的数据不同,句号)

指针不是数据。指针是指向数据的指针。指针也不是数据的副本。(指针的一个重要用途是,由于指针通常要小得多,所以更有效的方法是复制指针,将指针指向的数据保留在原位,而不是复制周围的数据。)


这可能是一个毫无意义的类比:我身高近7英尺,体重约240磅。然而,当我把我的名字写在一张纸上时,我的名字大约为8½×11英寸,重量不到一盎司。为什么史蒂夫·萨米特的名字与史蒂夫·萨米特的大小和重量不同呢?

指针的大小几乎总是与它的数据大小不同指向,因为指针与其指向的数据不同(不同,周期),这是一个简单而基本的原因

指针不是数据。指针是指向数据的指针。指针也不是数据的副本。(指针的一个重要用途是,由于指针通常要小得多,所以更有效的方法是复制指针,将指针指向的数据保留在原位,而不是复制周围的数据。)


这可能是一个毫无意义的类比:我身高近7英尺,体重约240磅。然而,当我把我的名字写在一张纸上时,我的名字大约为8½×11英寸,重量不到一盎司。为什么史蒂夫·萨米特的名字与史蒂夫·萨米特的大小和重量不同?

指针的大小与打字之间没有关系d它指向的类型的大小。
sizeof(int)
sizeof(int*)
在您的系统上产生相同的值是巧合(它们在我的系统上没有)

指针存储地址(物理或虚拟)-在具有平面内存模型的x86系统上,所有指针类型的大小都相同(通常为本机字大小,在大多数桌面系统上为32位或64位)。但是,存在一些奇怪的体系结构,其中指针类型的大小可能不同

唯一的要求1是:

  • char*
    void*
    具有相同的大小和表示形式
  • 指向兼容类型的合格或不合格版本的指针具有相同的大小和表示形式(即,
    int*
    const int*
    volatile int*
    具有相同的大小)
  • 所有
    struct
    指针类型具有相同的大小和表示形式
  • 所有
    union
    指针类型具有相同的大小和表示形式
除此之外,什么都不能保证


  • ,§6.2.5,第28条。
    指针类型的大小与其指向的类型的大小之间没有关系。
    sizeof(int)
    sizeof(int*)
    在您的系统上产生相同的值是巧合(它们在我的系统上没有)

    指针存储地址(物理或虚拟)-在具有平面内存模型的x86系统上,所有指针类型的大小都相同(通常为本机字大小,在大多数桌面系统上为32位或64位)。但是,存在一些奇怪的体系结构,其中指针类型的大小可能不同

    唯一的要求1是:

    • char*
      void*
      具有相同的大小和表示形式
    • 指向兼容类型的合格或不合格版本的指针具有相同的大小和表示形式(即,
      int*
      const int*
      volatile int*
      具有相同的大小)
    • 所有
      struct
      指针类型具有相同的大小和表示形式
    • 所有
      union
      指针类型具有相同的大小和表示形式
    除此之外,什么都不能保证


  • ,§6.2.5,第28条。

    您的
    结构
    具有大小
    8
    ,指针为h
    #include<stdio.h>
    
    int main()
    {
         int *b;
         printf("sizeof b is %d\nSize of *b is %d",sizeof(b),sizeof(*b));
    }
    
    sizeof b is 4
    Size of *b is 4
    Process returned 0 (0x0)   execution time : 0.475 s
    Press any key to continue.