我编译了这段代码,它给出了3次'&x‘的值。也就是说,如果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;
}发布于 2016-02-05 11:11:15
X是指向指针数组的指针。指针数组有4个元素。这四个元素中的每一个都指向3个整数。
因此,如果x= 2000,
X=2000年,x1 =2012年,x2 =2024年,x3 =2036年。
因此,
X+3= 2036 (因为x是一个数组指针,每次增加12 )。
*(x+3) = x3 = 2036。
*(x+2)+3 = x2 +3= 2024 + 3*4 = 2036。
因此,输出将是三个相同的数字。
发布于 2016-02-05 10:49:23
这段代码的输出是什么?
任何事情都可能发生,因为代码通过使用unsigned的转换说明符打印指针值来引发未定义的行为。
若要打印指针值,请使用转换说明符p。
数组的地址与其第一个元素的地址相同。然而,指向它们的指针是不同类型的。
x和x + 3都是int (*)[3]类型,即指向一个由三个int组成的数组,假设int为size 4,三个ints的数组为12大小。
将x (指向int (*)[3]的指针)增加三个元素,最终得到x指向的地址3 * 12字节。这被称为指针算法。
发布于 2016-02-05 10:53:52
因此,您误用了格式说明符并调用了未定义的行为。在这一点上,所发生的事情是武断和无趣的。
如果要打印指针,请使用%p说明符。
https://stackoverflow.com/questions/35222163
复制相似问题