为什么在下面的 C 代码中,结构指针 **s 的大小在取消引用到 '*s' 并进一步到 's' 时是 8? .谁能解释一下

问题描述

结构

     struct student
     {
              int rollno;
              char name[10];
              float marks;
     };
     

主要功能

     void main()
     {
              struct student **s;
              int n;

动态分配的内存总大小

              printf("Enter total number of students:\n");
              scanf("%d",&n);

              printf("Size of **s: %ld\n",sizeof(**s));

为什么 *s 和 s 的大小在这里是 8?

              printf("Size of *s: %ld\n",sizeof(*s));

              printf("Size of s: %ld\n",sizeof(s));

              s = (struct student **)malloc(sizeof(struct student *)* n);

动态分配内存给指针数组

              for(int i = 0; i<n; i++)
                   s[i]=malloc(sizeof(struct student));

用户定义数据

              for(int i = 0; i<n; i++)
              {
                   printf("Enter the roll no:\n");
                   scanf("%d",&s[i]->rollno);

                   printf("Enter name:\n");
                   scanf("%s",s[i]->name);

                   printf("Enter marks:\n");
                   scanf("%f",&s[i]->marks);
              }

              printf("Size of **s:%ld\n",sizeof(**s));
              for(int i = 0; i<n; i++)
                    printf("%d %s %f\n",s[i]->rollno,s[i]->name,s[i]->marks);

              free(s);
     }

解决方法

指针类型和它们在主机系统上表示地址所需的一样大。在 x86-64 平台上,所有指针类型都倾向于 64 位或 8 个 8 位字节宽。 表达式 s*s 都具有指针类型(分别为 struct student **struct student *),因此在您的平台上它们都是 8 个字节宽。

指针类型的大小在不同平台上会有所不同,同一平台上不同的指针类型可能会有不同的大小。唯一的要求是:

  • char *void * 具有相同的大小和对齐方式;
  • 指向限定类型​​的指针与其非限定等价物(例如,sizeof (const int *) == sizeof (int *))具有相同的大小和对齐方式
  • 所有 struct 指针类型都具有相同的大小和对齐方式;
  • 所有 union 指针类型都具有相同的大小和对齐方式。
,

为什么 *s 和 s 的大小在这里是 8?

原因:*s 是一个指针(struct student*),s 是一个指向指针(struct student**)的指针。
并且一个指针的大小是 8 字节(64 位系统)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...