加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

访问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;
~~~~~~~~~^

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读