我准确地写下了下面的代码,并且它应该产生";203620362036";但每当我按下"0"时,它总是返回8-9位奇怪的随机值;运行";按钮重复。
有人知道吗?
#include <stdio.h>
int main()
{
unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6},
{7, 8, 9}, {10, 11, 12}};
printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);
}
您声明了一个二维数组
unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6},
{7, 8, 9}, {10, 11, 12}};
用于调用printf
中的参数表达式
printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);
它被隐式地转换为指向其类型为CCD_ 2的第一元素的指针。
因此,x + 3
是指向数组第四行的指针,您正试图将其输出为无符号int,从而导致未定义的行为。
表达式*( x + 3 )
产生数组的第四行,该第四行被隐式地转换为指向该行的第一元素的指针。因此,数组第四行第一个元素的地址被输出为无符号int,它再次调用未定义的行为。
表达式*(x+2)
给出如上所述的第三行的第一元素。因此表达式*(x+2)+3
在第三行的最后一个元素之后产生存储器的地址。
只需像一样重写printf
的调用
printf("%p, %u, %un", ( void * )( x+3 ), **(x+3), **(x+2)+3);
你会得到第四行的地址,第四行第一个元素的值(10(和第三行第一个元件的值(7(加上3,即10。
否则你需要写
printf("%p, %p, %pn", ( void * )( x+3 ), ( void * )( *(x+3) ), ( void * )( *(x+2)+3 ) );
以输出具有指针类型的原始表达式。