【发布时间】:2016-12-06 13:30:10
【问题描述】:
我试图在 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)中,为什么在第二个循环之前另一个数组初始化会改变一切。
【问题讨论】:
-
br[-1]是 Undefined Behavior.... 就是这样 -
我不这么认为。我认为这与内存分配有关。
-
不,是UB,纯粹而简单。编译器保留吃掉你的猫的权利。
-
我会说这是未指定或实现定义的行为,因为只有值未定义但 br[-1] 是!
-
@izlin:你怎么知道 br[-1] 被定义了?如果您正在考虑“堆栈”,请注意堆栈是一个实现概念而不是语言概念。
标签: c gcc clang llvm-clang