| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 912 人关注过本帖
标题:关于结构体的一些思考
只看楼主 加入收藏
zhuwenkai
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2013-4-26
收藏
 问题点数:0 回复次数:16 
关于结构体的一些思考
先看下面的一个例子:
#include<stdio.h>
typedef struct student stu;
typedef struct book boo;
struct student{
    int age;
    boo b;
}
struct book{
    char name[10];
}
main(){
......
}
运行程序会提示,在用结构体book之前必须先定义这个结构体。
如果把程序改写成下面的一种形式:
#include<stdio.h>
typedef struct student stu;
typedef struct book boo;
struct student{
    int age;
    boo *b;
}
struct book{
    char name[10];
}
main(){
......
}
再次运行这个程序不再提示任何异常,唯一修改的地方由原先的结构体变量变成了指针变量;

以下是我个人分析的结果,有什么不对的地方,麻烦各位大神给指点指点,我是学习java的刚开始准备了解了解c语言:
1。c语言是面向过程的语言,在第一个程序中,当解析到boo b;这行代码时,他不知道该为这个结构体变量分配多大的存储空间,book这个结构体是在student结构体下面定义的,所以会抛出异常,如果用结构体的指针变量的话,就不一样了,在c语言中,指针变量的存储空间都是4个字节,当解析到book *b这句话时,编译器就可以为*p这个指针变量分配四个字节的空间,所以程序能够正常运行。
2。所以在用结构体实现链表的数据结构的时候,对自身结构体的引用都是靠指针变量来实现的,如:
struct student{
    int age;
    struct student *s;
}

由于是第一次在编程论坛上发帖,有什么不足的地方还望各位大神不吝赐教,我的QQ号:2621933104 有兴趣一起学习交流c语言的可以加这个QQ号,期待你的加入,谢谢!
搜索更多相关主题的帖子: 运行程序 include 结构体 
2013-04-26 09:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你写段使用这些数据结构的代码运行了看自己说的对不对

授人以渔,不授人以鱼。
2013-04-26 09:38
zhuwenkai
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2013-4-26
收藏
得分:0 
回复 2楼 TonyDeng
我已经试过了,就是这种结果,你说的很对,程序是给人看的,如果对编译器如果运行的一点不去了解的话,对很多问题你只知道应该怎么用,而不知道为什么这样
2013-04-26 09:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看来你没明白什么叫使用这些数据结构运行程序,不是编译过了就算是“运行”。

授人以渔,不授人以鱼。
2013-04-26 09:46
zhuwenkai
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2013-4-26
收藏
得分:0 
回复 4楼 TonyDeng
不好意思,刚学c语言没多久,我还是不太明白你的意思,能否写一段程序来说明一下,求赐教,非常感谢
2013-04-26 09:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你在main()中定义一个stu变量并给它赋值、输出看看程序会不会崩溃。

授人以渔,不授人以鱼。
2013-04-26 09:52
zhuwenkai
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2013-4-26
收藏
得分:0 
回复 6楼 TonyDeng
#include<stdio.h>
typedef struct student a;
struct student{
    int code;
    int age;
    a *e;
} stu1={1,2,NULL};


main(){
    stu1.code=3;
    printf("%d  %d",stu1.code,stu1.age,stu1.e);
   
}
这样测试行不行,我运行了一下,程序并没有崩溃,你说的是哪种情况会崩溃,麻烦你了
2013-04-26 10:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你企图回避字符串的使用,给boo赋值看看。

授人以渔,不授人以鱼。
2013-04-26 10:05
zhuwenkai
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2013-4-26
收藏
得分:0 
回复 8楼 TonyDeng
#include<stdio.h>
typedef struct book boo;

struct book{
    char *name;
    int number;
} book1={"wo",15};

main(){
    printf(" %s",book1.number);
   
}
这个程序运行,确实崩溃,麻烦问一下为什么会出现这种情况,非常感谢
2013-04-26 10:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
因为你不知道指针并不是数据本身,定义一个指针,它只具有指针尺寸的空间,在32位系统中永远是4byte大小,这只是一个用来储存地址值的变量,真正的数据要依据这个地址(即指针的值)再寻址到对应的内存中提取。你定义了一个指针,但它所指向的数据在哪里呢?那个数据已经拥有空间了吗?有值吗?这三个问题,是使用指针的时候必须要考虑清楚的。

你9楼的代码,book1={"wo",15},试图把常量字符串复制给book1变量中的name指针所指向的空间,但name的指向没有初始化,它的值(地址)是随机的,而且也没有为name申请足够储存字符串"wo"的空间。

如果你明白了这个,回头看看1楼自己说的那些,就知道哪里错了。

[ 本帖最后由 TonyDeng 于 2013-4-26 10:37 编辑 ]

授人以渔,不授人以鱼。
2013-04-26 10:36
快速回复:关于结构体的一些思考
数据加载中...
 
   



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

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