用C语言编写的数组

时间:2014-03-01 11:38:03

标签: c arrays

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]之内?

2 个答案:

答案 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。