为什么gcc没有发现这个错误?

发布于 2022-07-21 15:22:38 字数 393 浏览 6 评论 7

main()
{
    struct NONE_STRUCT *foo;//NONE_STRUCT 未在任何地方定义,自己乱写的

    printf("foo is %dn", foo);
}
为什么NONE_STRUCT 未在任何地方定义, gcc却编译通过,而且运行正常,显示为foo is 1073828704之类的结果?

环境: RedHat 9.0(2.4.20-
gcc v3.2.2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

就是爱搞怪 2022-07-26 09:25:12

原帖由 Bayweb 于 2006-8-14 21:53 发表

>>
>>
>>这两者的区别是在内存中地存储方式不一样,前一个以结构体的形式进行存储,
>>后一个使用一般变量的存储方式。例如int就是一个变量元素,通常不可再进行
>>划分,程 ...

>>
>>
>>指向空结构体的指针,我个人认为说到底还是int型,因为指针本身就是int型,只不过是特殊的数,
>>其值指向内存中某一个地址,而且该地址代表一个struct结构,但是该结构为空。不知道这样说对
>>不对。
>>
>>

め七分饶幸 2022-07-26 09:22:59

原帖由 ld_jia 于 2006-8-14 21:13 发表
不过,那个空结构指针到底是什么东西呢,它跟这样定义

int *foo1;
的指针有什么区别呢?这个foo1没有初始化,值也是不确定的啊!

>>
>>
>>这两者的区别是在内存中地存储方式不一样,前一个以结构体的形式进行存储,
>>后一个使用一般变量的存储方式。例如int就是一个变量元素,通常不可再进行
>>划分,程序读取的时候一般对整个int变量进行操作;但是对于结构体不是这样,
>>由于结构体含有自己的成员(你这里的定义为空,就是没有成员),所以结构体
>>在内存中还可以按照成员元素来进行进一步的划分并独立操作。
>>
>>下面简单的表示了一下变量和结构体在内存中的分布情况:
>>变量(通常为一个操作单元):
>>+------------+
>>|    1           |
>>+------------+
>>
>>结构体(通常为元素个数个操作单元):
>>+--------------------------------------------+
>>|     1         |     2      |     3   |   4...      |
>>+--------------------------------------------+
>>
>>其中每一个操作单元可以是各种类型的变量(int、char、point....)
>>
>>

孤千羽 2022-07-26 06:02:20

不过,那个空结构指针到底是什么东西呢,它跟这样定义

int *foo1;
的指针有什么区别呢?这个foo1没有初始化,值也是不确定的啊!

夏至、离别 2022-07-24 20:06:55

多谢Bayweb 指点!~

故事与诗 2022-07-24 11:04:50

原帖由 ld_jia 于 2006-8-14 15:04 发表
main()
{
    struct NONE_STRUCT *foo;//NONE_STRUCT 未在任何地方定义,自己乱写的

    printf("foo is %dn", foo);
}
为什么NONE_STRUCT 未在任何地方定义, gcc却编译通过,而且运行正常,显示 ...

>>
>>
>>你要是使用-Wall参数编译,应该有警告信息,是关于printf("foo is %dn", foo);中
>>foo类型的警告。在这里,foo是一个NONE_STRUCT 型的空结构指针。之所以是空结
>>构指针,是因为NONE_STRUCT 是未定义的,实际上就是定义了一个指针变量,但是
>>没有赋给任何值,所以是一个空指针,其值不确定。
>>
>>

小梨窩很甜 2022-07-23 17:19:43

那是个什么类型的指针呢?
类型中的错误为什么不报呢?

小镇女孩 2022-07-22 12:28:12

foo,只是个指针而已。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文