1

我正在试验指针数组地址计算算法。我对上面代码的输出感到困惑。谁能解释发生了什么?

void foo()
{
    int i=10,k=3,l=20,m=30;
    int *ary[2];
    ary[0]=&i;
    int b=20;
    ary[1]=&k;

    printf("%d\n",ary[0][1]);
}

输出为 3

第二个节目

void foo()
{
    int i=10,k=3,l=20,m=30;
    int *ary[2];
    ary[0]=&i;
    int b=20;
    ary[1]=&b;

    printf("%d\n",ary[0][1]);
}

输出为 20。

上述这些代码中的地址计算是如何完成的?

4

2 回答 2

3

在这两个代码示例中ary[0]都是一个指向单个整数的指针。因此,当您这样做时,array[0][1]您正在越界访问该指针。因此,您的两个代码示例的行为都是未定义的。

你得到你在特定编译器上看到的行为的原因可能是,所有你不使用地址的变量都存储在寄存器中而不是内存中(或者可能根本没有存储它们,因为你从不使用它们)。

所以在示例 1 中,内存中唯一的变量是 i 和 k。在示例 2 中,内存中唯一的变量是 i 和 b。因此,在示例 1k中是直接出现i在内存中的变量,而示例 2 中的变量是b.

于 2012-06-24T06:52:13.160 回答
0

你的论点是

int *ary[]

在函数参数中,数组衰减为指针。所以你基本上有

int** ary

然后将索引 0 处的指针(可能是一个有效索引)设置为单个变量的值。

ary[0]=&i;

然后你的代码打印

ary[0][1]

这基本上是

( &i )[1]

触发未定义的行为,因此您得到的任何结果都是有效的结果。

于 2012-06-24T06:52:03.413 回答