| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9131 人关注过本帖
标题:求助:使用malloc函数构造结构体时 sizeof()函数中写“结构体名”和写“结构 ...
取消只看楼主 加入收藏
yf19863
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
求助:使用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;
            }
        }
}

我是新人,也查了一下资料,发现讲的都不太好,也不怎么看得懂。

所以发个贴问一下。
搜索更多相关主题的帖子: 档案管理 结构体 规范性 动态 
2016-11-18 11:39
yf19863
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-7
收藏
得分:0 
回复 2楼 grmmylbs
额,但是如果申请了4平米的话,怎么可以盖28平米呢?
不是函数本身的内存空间,不是不可以读写的吗?
2016-11-18 13:38
yf19863
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-7
收藏
得分:0 
回复 3楼 azzbcc
再问个问题,在VC++6.0中,这个例程中:
struct student
{
    char name[20];
    int age;
    int score;   //此处异常,如果改成float score 之后的输入输出修改成 %f 时系统编译正常,运行时错误退出;
};

这个是什么情况 ?难道结构体中不可以使用float或者double两个基本类型?
2016-11-18 14:07
yf19863
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-7
收藏
得分:0 
回复 6楼 九转星河
感谢
2016-11-19 09:57
yf19863
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-7
收藏
得分:0 
回复 11楼 EdmundDantes
感谢
2016-11-19 09:57
yf19863
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-7
收藏
得分:0 
回复 7楼 grmmylbs
感谢,继续看书去 ...
2016-11-19 09:58
快速回复:求助:使用malloc函数构造结构体时 sizeof()函数中写“结构体名”和写 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018130 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved