我在实验指针数组,地址计算算法,我对上面code.Could的输出感到困惑,有人解释了发生了什么吗?
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.
在这些代码中,地址计算是如何完成的?
发布于 2012-06-24 06:52:13
在这两个代码示例中,ary[0]都是指向单个整数的指针。因此,当您执行array[0][1]时,您将访问超出界限的指针。因此,这两个代码示例的行为都是未定义的。
您在特定编译器上看到的行为的原因可能是,您不使用的所有变量都存储在寄存器中,而不是内存中(或者它们根本没有存储,因为您从未使用它们)。
所以在例1中,内存中唯一的变量是i和k,在示例2中,内存中的唯一变量是i和b,所以在示例1中,k是内存中i后面的变量,而示例2则是b。
发布于 2012-06-24 06:52:03
你的论点是
int *ary[]在函数参数中,数组衰减为指针。所以你基本上有
int** ary然后,在索引0处将指针设置为单个变量的值,这大概是一个有效的索引。
ary[0]=&i;然后你的代码打印
ary[0][1]基本上
( &i )[1]触发未定义的行为,因此无论得到什么结果都是有效的结果。
https://stackoverflow.com/questions/11175473
复制相似问题