%C语言中的u格式说明符
我编译了这段代码,它给出了“&x”的值3次。也就是说,如果&x=2000,它将2036打印三次。假设一个整数需要4字节的内存,我想知道这种行为的原因%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; } #包括 内部主(空){ //你的密码在
#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的正式事实上…:-