为什么struct的大小与struct指针的大小不同

时间:2019-09-27 09:23:35

标签: c

这是我的代码,为什么struct的大小与struct指针的大小不同

#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.

1)在上面的代码中,struct的总大小为8,指针的大小为     4这是为什么?   2)但是当我编译以下代码

#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.

那么为什么sizeof结构显示不同的大小,为什么显示此“ s的大小为4”呢?

3 个答案:

答案 0 :(得分:3)

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

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

在许多实现中,指针的大小与int相同,因为两者都受目标处理器体系结构的功能影响,但是C标准并不需要。

但是,结构的大小差异很大,因为它们的大小取决于其内容。相比之下,指向结构的指针的大小并不取决于结构的内容,而不仅仅是房屋的邮政地址的长度取决于房屋的大小或内容。

答案 1 :(得分:1)

指针类型的大小与其指向的类型的大小之间没有关系。 sizeof (int)sizeof (int *)在您的系统上产生相同的值是偶然的(它们不在我的系统上)。

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

唯一的需求 1 是:

  • char *void *具有相同的大小和表示形式
  • 兼容类型的合格或不合格版本的指针具有相同的大小和表示形式(即int *const int *volatile int *具有相同的大小)
  • 所有struct指针类型都具有相同的大小和表示形式;
  • 所有union指针类型都具有相同的大小和表示形式;

没有任何保证。


  1. C 2011 online draft,第6.2.5节,第28条。

答案 2 :(得分:0)

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

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

可能毫无意义的比喻:我高7英尺,体重约240磅。但是,当我在一张纸上书写时,我的名字大约是8½×11英寸,重量不到一盎司。为什么Steve Summit的名字和Steve Summit的名字和大小不同?

相关问题