为什么在下面的 C 代码中结构指针 **s 的大小在取消引用为 '*s' 并进一步指向 's' 时为 8? .谁能解释一下
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
Structure
struct student
{
int rollno;
char name[10];
float marks;
};
main Function
void main()
{
struct student **s;
int n;
Total size of memory to be dynamically allocated
printf("Enter total number of students:\n");
scanf("%d",&n);
printf("Size of **s: %ld\n", sizeof(**s));
Why the size of *s and s is 8 here ?
printf("Size of *s: %ld\n", sizeof(*s));
printf("Size of s: %ld\n", sizeof(s));
s = (struct student **)malloc(sizeof(struct student *)* n);
Allocating memory dynamically to array of pointers
for(int i = 0; i<n; i++)
s[i]=malloc(sizeof(struct student));
User defined data
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);
}
Why the size of *s and s is 8 here ?
原因:*s
是一个指针(struct student*
),s
是一个指向指针的指针(struct student**
)。
而一个指针的大小是8字节(64位系统)
指针类型与表示主机系统上的地址所需的一样大。在 x86-64 平台上,所有指针类型都倾向于 64 位或 8 个 8 位字节宽。 表达式 s
和 *s
都具有指针类型(分别为 struct student **
和 struct student *
),因此在您的平台上它们是都是 8 字节宽。
指针类型的大小在不同的平台上会有所不同,同一平台上不同的指针类型可能有不同的大小。唯一的要求是:
char *
和 void *
具有相同的大小和对齐方式;
- 指向限定类型的指针与其非限定等价物(例如,
sizeof (const int *) == sizeof (int *)
)具有相同的大小和对齐方式
- 所有
struct
指针类型具有相同的大小和对齐方式;
- 所有
union
指针类型具有相同的大小和对齐方式。
Structure
struct student
{
int rollno;
char name[10];
float marks;
};
main Function
void main()
{
struct student **s;
int n;
Total size of memory to be dynamically allocated
printf("Enter total number of students:\n");
scanf("%d",&n);
printf("Size of **s: %ld\n", sizeof(**s));
Why the size of *s and s is 8 here ?
printf("Size of *s: %ld\n", sizeof(*s));
printf("Size of s: %ld\n", sizeof(s));
s = (struct student **)malloc(sizeof(struct student *)* n);
Allocating memory dynamically to array of pointers
for(int i = 0; i<n; i++)
s[i]=malloc(sizeof(struct student));
User defined data
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);
}
Why the size of *s and s is 8 here ?
原因:*s
是一个指针(struct student*
),s
是一个指向指针的指针(struct student**
)。
而一个指针的大小是8字节(64位系统)
指针类型与表示主机系统上的地址所需的一样大。在 x86-64 平台上,所有指针类型都倾向于 64 位或 8 个 8 位字节宽。 表达式 s
和 *s
都具有指针类型(分别为 struct student **
和 struct student *
),因此在您的平台上它们是都是 8 字节宽。
指针类型的大小在不同的平台上会有所不同,同一平台上不同的指针类型可能有不同的大小。唯一的要求是:
char *
和void *
具有相同的大小和对齐方式;- 指向限定类型的指针与其非限定等价物(例如,
sizeof (const int *) == sizeof (int *)
)具有相同的大小和对齐方式 - 所有
struct
指针类型具有相同的大小和对齐方式; - 所有
union
指针类型具有相同的大小和对齐方式。