我精确地在下面写下代码,它应该生成"2036,2036,2036“,但是每当我反复按"Run”按钮时,它就会返回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);
} 发布于 2022-04-10 12:06:24
您声明了一个二维数组。
unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6},
{7, 8, 9}, {10, 11, 12}};用于调用pf printf中的参数表达式。
printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);它被隐式转换为指向类型unsigned int ( * )[3]的第一个元素的指针。
因此,x + 3是指向数组的第四行的指针,您试图将其作为一个无符号int输出,从而导致未定义的行为。
表达式*( x + 3 )生成数组的第四行,该数组被隐式转换为指向行的第一个元素的指针。因此,数组第四行的第一个元素的地址被输出为一个无符号int,它再次调用未定义的行为。
表达式*(x+2)给出了上面描述的第三行的第一个元素。因此,表达式*(x+2)+3在第三行的最后一个元素之后产生内存的地址。
只需重写printf的调用就可以了
printf("%p, %u, %u\n", ( void * )( x+3 ), **(x+3), **(x+2)+3);您将得到第四行的地址、第四行( 10 )的第一个元素的值和第三行(7)的第一个元素的值加上3,即10。
否则你需要写
printf("%p, %p, %p\n", ( void * )( x+3 ), ( void * )( *(x+3) ), ( void * )( *(x+2)+3 ) );若要输出具有指针类型的原始表达式,请执行以下操作。
https://stackoverflow.com/questions/71816365
复制相似问题