我正在尝试使用指针数组地址计算算法。我对上面代码的输出感到困惑。有谁可以解释发生了什么?
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。
如何在上述代码中完成地址计算?
答案 0 :(得分:3)
在两个代码示例中,ary[0]
是指向单个整数的指针。因此,当您执行array[0][1]
时,您正在访问该指针超出范围。因此,两个代码示例的行为都是未定义的。
您获得在特定编译器上看到的行为的原因可能是,您没有采用其地址的所有变量都存储在寄存器中而不是存储在内存中(或者可能不存储它们因为你从不使用它们。)
因此在例1中,内存中唯一的变量是i和k。在例2中,内存中唯一的变量是i和b。因此,在示例1中k
是直接在内存中i
之后的变量,而示例2中的变量是b
。
答案 1 :(得分:0)
你的论点是
int *ary[]
在函数参数中,数组衰减为指针。所以你基本上有
int** ary
然后将指针设置为索引0,大概是一个有效索引,指向单个变量的值。
ary[0]=&i;
然后打印代码
ary[0][1]
基本上是
( &i )[1]
触发未定义的行为,因此无论您获得什么结果都是有效的结果。