%C语言中的u格式说明符

%C语言中的u格式说明符,c,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; } #包括 内部主(空){ //你的密码在

我编译了这段代码,它给出了“&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;
}
#包括
内部主(空){
//你的密码在这里
int x[4][3]={0};
printf(“%u%u%u”,x+3,*(x+3),*(x+2)+3);
返回0;
}
这段代码的输出是什么

当代码通过使用
无符号
的转换说明符打印指针值而引发未定义行为时,任何情况都可能发生

要打印指针值,请使用转换说明符
p


数组的地址与其第一个元素的地址相同。然而,指向它们的指针是不同类型的


x
以及
x+3
属于
int(*)[3]
类型,指向三个
int
的数组。假设
int
的大小为
4
,则三个
int
s的数组的大小为
12

x
(指向
int(*)[3]
的指针)增加三个元素,最后得到一个地址
3*12
字节,超出
x
指向的位置。这称为指针算术

这段代码的输出是什么

当代码通过使用
无符号
的转换说明符打印指针值而引发未定义行为时,任何情况都可能发生

要打印指针值,请使用转换说明符
p


数组的地址与其第一个元素的地址相同。然而,指向它们的指针是不同类型的


x
以及
x+3
属于
int(*)[3]
类型,指向三个
int
的数组。假设
int
的大小为
4
,则三个
int
s的数组的大小为
12


x
(指向
int(*)[3]
的指针)增加三个元素,最后得到一个地址
3*12
字节,超出
x
指向的位置。这称为指针算术。

您误用了格式说明符,并因此调用了未定义的行为。在这一点上,所发生的事情是武断和无趣的


如果要打印指针,请使用
%p
说明符。

您误用了格式说明符并因此调用了未定义的行为。在这一点上,所发生的事情是武断和无趣的


如果要打印指针,请使用
%p
说明符。

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


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

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


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

@Rame:你不仅“可以”使用
p
,而且你应该,因为未定义的行为是未定义的。这个问题是在一次竞争性考试中提出的。因此,必须回答这个问题。这种行为并不是没有定义的。我找到了对输出的解释:)@Rama;有趣!你怎么能如此确定这不是未定义的行为?请让我们知道。C11标准(草案)7.21.6.1/9:“……如果任何参数的类型与相应的转换规范不符,则行为未定义。”@Rama@rama根据C11标准,这是未定义的行为,写问题的人弄错了。另一方面,在大多数32位系统(甚至16位系统)上)%u只会以十进制打印地址,即使从技术上讲是这样的:你不仅“可以”使用
p
,而且你应该,因为未定义的行为是未定义的。这个问题是在一次竞争性考试中提出的。因此,必须回答这个问题。这种行为并不是没有定义的。我找到了对输出的解释:)@Rama;有趣!你怎么能如此确定这不是未定义的行为?请让我们知道。C11标准(草案)7.21.6.1/9:“……如果任何参数的类型与相应的转换规范不符,则行为未定义。”@Rama@rama根据C11标准,这是未定义的行为,写问题的人弄错了。另一方面,在大多数32位系统(甚至16位系统)上,即使从技术上讲是UB,您也会以十进制形式打印地址。实际上,这里的要点不是错误的格式说明符,如果他使用了
%p
而不是
%u
,问题也会一样。在大多数32位系统(甚至16位系统)%上,你只会用十进制打印地址,即使从技术上讲是UB。@MichaelWalz:我同意。然而,这个问题的标题肯定是要把重点放在UB的正式事实上…:-/@MichaelWalz是的,但大多数系统并非都是系统。OP认识到UB是什么以及为什么他不需要它是非常重要的。实际上这里的要点不是错误的格式说明符,如果他使用了
%p
而不是
%u
,问题也会一样。在大多数32位系统(甚至16位系统)%上,你只会用十进制打印地址,即使从技术上讲是UB。@MichaelWalz:我同意。然而,这个问题的标题肯定是要把重点放在UB的正式事实上…:-