c语言中的结构体和标签

threefeets 2011-08-04 06:12:27
记得书上说要这样写
typedef struct label
{
int a;
struct label *ptr;
}lab
而这样写不对
typedef struct
{
int a;
struct lab *ptr;
}lab
因为前面的lab未声明。
但是我在调试时发现下面这样写能通过啊,怎么解释?

...全文
337 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
threefeets 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 anyidan 的回复:]

哪本书上说的?

本论坛搜 zhao4zhong1
[/Quote]
c和指针
AnYidan 2011-08-05
  • 打赏
  • 举报
回复
哪本书上说的?

本论坛搜 zhao4zhong1
izhongshaowu 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 threefeets 的回复:]
记得书上说要这样写
typedef struct label
{
int a;
struct label *ptr;
}lab
而这样写不对
typedef struct
{
int a;
struct lab *ptr;
}lab
因为前面的lab未声明。
但是我在调试时发现下面这样写能通过啊,怎么解释?
[/Quote]
不管在哪种平台,第一种都能通过的,第二种也能通过,我想教科书说的应该是:
typedef struct label
{
int a;
label *ptr;
}lab
这种定义方式,typedef struct 后面一定要加上label,否则不能编译通过。
ringer564597 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 threefeets 的回复:]
记得书上说要这样写
typedef struct label
{
int a;
struct label *ptr;
}lab
而这样写不对
typedef struct
{
int a;
struct lab *ptr;
}lab
因为前面的lab未声明。
但是我在调试时发现下面这样写能通过啊,怎么解释?
[/Quote]

如果那书上给出的原因就是这么一句“因为前面的lab未声明。”,
建议换本书,
虽然编译过程一般都是从上到下,但这不是唯一的方式,而且标识符转化为机器语言后不一定是占内存空间的。
比如说,你前面定义了一个int a;之后有句a++;
那么编译成机器语言后,这个a实际可能是不存在的,只是编译过程中编译器记住了a的地址,
假设这个地址是0x00ababab,那么最后执行时,a++;这句代码就是(0x00ababab)+1。
汇编中括号是取地址的内容。
所以,struct lab *ptr;这个lab的意义并不大,知道指针类型就够了。

想了解指针,其实自己DEBUG试试就知道了,
弄一个数据类型,再定义个指向它的指针,多赋几个值,去看看这两个地址的内容都有什么变化,
其它就没啥了。
threefeets 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 icemornings 的回复:]

你把第二个里面的改成struct XXXX *ptr;也照样能编译通过……
原因我想可能是:
你的第二个变量是指针变量,指针的长度在固定的环境下是固定大小的,32位一般为4Bytes。
编译器不看类型只看大小。
--------------------------
纯属个人理解。
[/Quote]
可能这样吧,待会验证下
icemornings 2011-08-04
  • 打赏
  • 举报
回复
你把第二个里面的改成struct XXXX *ptr;也照样能编译通过……
原因我想可能是:
你的第二个变量是指针变量,指针的长度在固定的环境下是固定大小的,32位一般为4Bytes。
编译器不看类型只看大小。
--------------------------
纯属个人理解。
threefeets 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ringer564597 的回复:]

C编译器?
[/Quote]
对啊,gcc编译器
ringer564597 2011-08-04
  • 打赏
  • 举报
回复
C编译器?

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧