int m=10,n=5,a[10]={10,15,20};
void f1(void);
void f2(int m);
main()
{
int i;
for(i=0;i<7;i++)
f1();
f2(1);
printf("\n%d,%d",a[m],a[n]);
system("pause");
}
void f1(void)
{
static int n=3;
a[n]=a[n-1]+a[n-2]+a[n-3];n++;
}
void f2(int m)
{
for(;m<3;m+=2)
{
int m;
for(m=1;m<4;m++)
printf("%d,",a[m++]);
}
}
输出是
15,45,
10145
谁能解释为什么[m] = 10? 标题为“a”的数组是否在[9]之内?
答案 0 :(得分:3)
C / C ++编译器不绑定检查数组。但行为是不可预测的。它可能会损坏内存,也可能会崩溃,或者它可能会运行而没有任何错误。
答案 1 :(得分:1)
通过gdb跟踪,你可以知道为什么[10]在最后一个是10。但实际上这种行为实际上是未定义的。
(gdb) b main
Breakpoint 1 at 0x100000cc4: file static_var.c, line 11.
(gdb) b f2
Breakpoint 2 at 0x100000e3b: file static_var.c, line 26.
(gdb) r
Breakpoint 1, main () at static_var.c:11
11 for(i=0;i<7;i++)
(gdb) x a
0x100001080 <a>: 0x0000000a
(gdb) x a+10
0x1000010a8 <n.1907>: 0x00000003
(gdb) c
Continuing.
Breakpoint 2, f2 (m=1) at static_var.c:26
26 for(;m<3;m+=2)
(gdb) x a
0x100001080 <a>: 0x0000000a
(gdb) x a+10
0x1000010a8 <n.1907>: 0x0000000a
a [10]的值实际上是f1函数中的访问静态变量n。之后
for(i=0;i<7;i++)
f1();
f1内的全局变量n增长到10 .ie 0xa。所以[10]结果是10。