%u格式C中的说明符

时间:2016-02-05 10:46:41

标签: c

我编译了这段代码,它给了'& 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;
}

3 个答案:

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

因此输出将是三个相同的数字。