问题描述
结构
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 位系统)