![]() |
1
57
我相信这里可能是这样:在第一个代码中,gcc注意到您根本不需要整个char数组,只是
现在,这是一个
完全地
合法转换,因为当数组被越界访问时,行为是
完全未定义
. 只有在后一阶段,它才会注意到这个变量,它是
为什么我相信这个?因为如果我加上
只是
任何代码
参考
数组的地址
记忆
例如,
我发现更有趣的是,除非启用了优化,否则GCC根本不会诊断出边界访问。这再次表明,无论何时编写新程序,都应使用启用的优化对其进行编译,使错误高度可见,而不是使用调试模式隐藏它们;) |
![]() |
2
17
阅读行为
您的编译器正在发出一个警告(它不必发出),尽管警告文本有点误导性,但技术上并没有错误。在我看来,这相当聪明。(C编译器是 不 需要发出越界访问诊断。)
关于
|
![]() |
3
1
一些额外的实验结果。
使用
有趣的是,通过中的“next”成员初始化一个传递的元素
产量
笔记:
|
![]() |
4
-2
当您使用-o2编译代码时,示例的琐碎性使这个变量得到了优化。所以警告是100%正确的 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 6 月前 |
![]() |
MysteryMoose · GCC下故意忽略初始化器警告中的过量元素 8 月前 |
|
Ken P · 如何利用[*]printf格式类型规范警告? 12 月前 |
![]() |
fghoussen · 在C结构体中,为什么打包、对齐似乎会进行填充? 12 月前 |
![]() |
adversarr · 全局变量何时导出到可执行文件? 1 年前 |