我编译了这段代码,它给了'& x'3次的值。也就是说,如果& x = 2000,它打印2036三次。我想知道这种行为的原因,假设一个整数需要4个字节的内存。
#include <stdio.h>
int main(void) {
// your code goes here
int x[4][3] = {0};
printf("%u %u %u", x+3, *(x+3), *(x+2)+3);
return 0;
}
答案 0 :(得分:3)
此代码的输出是什么
任何事情都可能发生,因为代码通过使用protected void Page_Load(object sender, EventArgs e)
{
var master = this.Master as Master1;
if (master != null)
{
master.MeaningfulNameForLabelText = "Hello";
}
}
的转换说明符打印指针值来激发未定义的行为。
要打印指针值,请使用转换说明符unsigned
。
数组的地址和第一个元素的地址是相同的。然而,它们的指针都是不同类型的。
p
以及x
属于x + 3
类型,指向三个int (*)[3]
的数组。假设int
的大小为int
,则三个4
的数组大小为int
。
将12
(指向x
的指针)增加三个元素,最后得到的地址int (*)[3]
字节超出3 * 12
指向的位置。这称为指针算法。
答案 1 :(得分:1)
您滥用格式说明符并因此而调用未定义的行为。那时,发生的事情是随意而无趣的。
如果要打印指针,请使用%p
说明符。
答案 2 :(得分:1)
x是指向指针数组的指针。指针数组有4个元素。这四个元素中的每一个都指向3个整数。
因此,如果x = 2000那么,
x [0] = 2000,x [1] = 2012,x [2] = 2024,x [3] = 2036。
因此,
x + 3 = 2036(因为x是一个数组指针,每次增加12个。)
再次*(x + 3)= x [3] = 2036。
*(x + 2)+3 = x [2] + 3 = 2024 + 3 * 4 = 2036再次。
因此输出将是三个相同的数字。