访问int(* foo)的索引4时没有警告[3]
发布时间:2020-12-16 10:04:09 所属栏目:百科 来源:网络整理
导读:在下面的代码中我很惊讶 gcc没有警告我索引.这是什么原因? int foo[3] = {1,2,3};int (*bar)[3];int main(void) { bar = foo; foo[42] = 42; (*bar)[42] = 42; return 0;} 我只得到foo的错误而不是bar.为什么? $gcc -std=c99 -Wall -O2 -Wpedantic -Wextra
在下面的代码中我很惊讶
gcc没有警告我索引.这是什么原因?
int foo[3] = {1,2,3}; int (*bar)[3]; int main(void) { bar = &foo; foo[42] = 42; (*bar)[42] = 42; return 0; } 我只得到foo的错误而不是bar.为什么? $gcc -std=c99 -Wall -O2 -Wpedantic -Wextra test.c test.c: In function ‘main’: test.c:6:8: warning: array subscript is above array bounds [-Warray-bounds] foo[42] = NOPE; ^ 注意 我本来可以写bar = foo并声明bar为int * bar,但我没有,我不知道为什么……一个解决方案比另一个好,这是另一个有趣的问题. 解决方法
如果您对foo访问进行评论,则会在栏访问时显示警告,因此看起来只是gcc没有向您显示两次相同警告的情况.
是否应该将它们归类为另一个问题的同一警告 – 一方面看到有两个不同类型的变量,但另一方面它们是同一个记忆的别名.但这对我来说似乎很合理.在最坏的情况下,您需要进行额外的编译,直到您修复它们. int foo[3] = {1,3}; int (*bar)[3]; int main() { bar = &foo; // foo[42] = 42; (*bar)[42] = 42; // warning return 0; } 20 : warning: array subscript is above array bounds [-Warray-bounds] (*bar)[42] = 42; ~~~~~~~~~^ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |