【问题标题】:Why is the size of structure pointer **s when derefenced to '*s' and further to 's' is 8 in the below code in C? . Can anybody please explain it为什么在下面的 C 代码中,结构指针 **s 的大小在取消引用到 '*s' 并进一步到 's' 时是 8? .谁能解释一下
【发布时间】:2021-04-03 08:07:39
【问题描述】:

结构

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

【问题讨论】:

  • 两个sizeof() 表达式都有一个指针类型作为参数。你希望他们是什么?
  • 请注意,size_tsizeof 的结果类型)最合适的转换说明符是 %zu
  • 当我试图找出指针的大小时,我发现它是 4 个字节。我知道指针大小取决于机器,与任何指针类型无关。但是当试图找到分配给它的结构的指针大小时,它给出了 8 个字节,所以我担心的是为什么这些指针有两种不同的大小

标签: c++ c pointers structure sizeof


【解决方案1】:

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

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

  • char *void * 具有相同的大小和对齐方式;
  • 指向合格类型的指针与不合格类型的指针具有相同的大小和对齐方式(例如,sizeof (const int *) == sizeof (int *)
  • 所有struct 指针类型具有相同的大小和对齐方式;
  • 所有union 指针类型具有相同的大小和对齐方式。

【讨论】:

  • 当我试图找出指针的大小时,我发现它是 4 个字节。我知道指针大小取决于机器,与任何指针类型无关。但是当试图找到分配给它的结构的指针大小时,它给出了 8 个字节。
  • @SavyTech:什么告诉你指针大小是 4 字节?另一个sizeof 表达式?
  • 关于“指针类型的大小与表示主机系统上的地址一样大”:实际上并非如此。我使用了一个在 64 位地址系统上使用 32 位指针的 C 实现。
  • @JohnBode:是的,我得到了澄清,谢谢你的详细解释
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 2016-10-10
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多