求助:使用malloc函数构造结构体时 sizeof()函数中写“结构体名”和写“结构体指针”的困惑
如题:使用malloc()函数时,参数为字节数,为了代码的移植性好还是规范性好还是其它的,我们会用sizeof函数。但是发现用sizeof()函数时,sizeof的参数用 数据类型 和用 数据类型指针 不影响程序运行 。那么问题来了:
假设一个结构体类型是100Byte;但是他的指针是它的首地址,那么还是4Byte;难道在使用malloc动态构造结构体数组
时,系统看到sizeof()函数的参数是一个指针时,还会更深一步的计算?从而得到这个结构体实际的字节数,再赋值给
malloc()函数本身?
/*
利用结构体来制作简单的学生档案管理
要求学生对象有三个属性(VB的说法):姓名name、年龄age、成绩score;
然后依照成绩给学生对象排序输出。
用函数来实现,不要全部写在main()中
*/
# include <stdio.h>
# include <string.h>
# include <malloc.h>
//定义结构体student
struct student
{
char name[20];
int age;
float score;
};
//主函数入口
int main(void)
{
void InputStudent(struct student * pstu,int len); //函数前置声明:信息输入InputStudent、输出、排序
void OutputStudent(struct student * pstu,int len);
void SortStudent(struct student * pstu,int len);
int len;
printf("Please input the students number:\n");
printf("Num_Student = ");
scanf("%d",&len);
struct student * stu; //定义结构体变量
stu = (struct student * )malloc(len * sizeof(struct student)); //动态构造数组stu ,此处有疑问:sizeof(struct student *)也不影响程序运行
printf("sizeof(struct student) = %d , sizeof(struct student *) = %d \n",sizeof(struct student),sizeof(struct student *));
InputStudent(stu,len); //输入学生信息
printf("您输入的学生信息为:\n");
OutputStudent(stu,len); //输出学生信息以便核对
printf("\n系统将以学生成绩排序,请稍候......\n");
SortStudent(stu,len); //按学生成绩排序(冒泡法)
printf("学生成绩升序排序后为:\n");
OutputStudent(stu,len); //排序后学生信息输出
return 0;
}
void InputStudent(struct student * pstu,int len)
{
int i ;
for(i = 0 ; i < len ; ++i)
{
printf("请输入第%d个学生信息:\n",i + 1);
printf("name = ");
scanf("%s",pstu[i].name); //name本身是一个name[30]的字符串数组,前不用加取地址符
printf("age = ");
scanf("%d",&pstu[i].age); //pstu[i]的取地址符容易丢,而且丢了编辑器不报错,程序运行时输入age时就会报错退出了
printf("score = ");
scanf("%f",&pstu[i].score); //取地址符不能丢,同上
}
}
void OutputStudent(struct student * pstu,int len)
{
int i = 0 ;
for(;i < len; ++i)
{
printf("Student_%d's :",i + 1);
printf("name = %s\t age = %d\t score = %.2f\n\n",pstu[i].name,pstu[i].age,pstu[i].score);
}
}
void SortStudent(struct student * pstu,int len)
{
int i ,j;
struct student t;
for(i = 0; i < len - 1; ++i )
for(j = 0 ; j < len - 1 - i; ++j)
{
if(pstu[j].score > pstu[j + 1].score)
{
t = pstu[j];
pstu[j] = pstu[j + 1];
pstu[j + 1] = t;
}
}
}
我是新人,也查了一下资料,发现讲的都不太好,也不怎么看得懂。
所以发个贴问一下。