我试图在c。
中的for循环中使用数组初始化这是我尝试的程序:
#include<stdio.h>
int main(){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
int br[10]={0};
printf("%d\n", br[-1]);
}
}
return 0;
}
使用gcc编译时此代码的结果为:
0 1 2 0 1 2 0 1 2
与clang编译时相同的程序,结果是:
0 0 0 0 0 0 0 0 0
如果我在开始第二次循环之前通过进行数组初始化来稍微调整程序:
#include<stdio.h>
int main(){
for(int i=0;i<3;i++){
int ar[10]={0};
for(int j=0;j<3;j++){
int br[10]={0};
printf("%d\n", br[-1]);
}
}
return 0;
}
gcc和clang
的输出为0 0 0 0 0 0 0 0 0
任何人都可以解释这里到底发生了什么,当我尝试访问负面索引时为什么这些结果会显示这两个不同的编译器(gcc和clang),为什么在第二个循环更改所有内容之前另一个数组初始化。
答案 0 :(得分:3)
br[-1]
的行为未定义。
C标准没有定义尝试访问数组 bounds 之外的元素的行为。 (有趣的是,它主要是因为C被许多人视为不安全的语言。)您可以随时检查生成的汇编程序,以便对编译器生成的内容进行全面分析。