*head
我想知道在使用scanf之后导致指针地址改变的原因。我知道我应该使用%hd来读取short int但是我只是想知道导致指针地址变化的原因是什么?另外为什么每次运行都会导致指针具有不同的地址长度以短地址?我首先想到的是因为初始读取短地址的大小然后是int的地址,但两个地址之间的差异总是不同。
这只是一种未定义的行为吗?
答案 0 :(得分:1)
要使用short int
阅读scanf
,请使用h
尺寸修饰符:
scanf("%hd",&a);
您的代码具有未定义的行为:scanf
从stdin
读取一个整数,并将其存储为int
地址a
。由于a
是short
,很可能小于架构上的int
,因此scanf
修改的一些字节属于另一个对象,可能是指针{{1你看到修改了,虽然由于对齐限制而不太可能。
另请注意,打印带pt
的指针也有未定义的行为,格式%x
需要%p
,其传递方式可能与void *
不同,实际上这些类型在某些体系结构上有不同的表示形式,例如旧的Cray超级计算机。
这是一个问题较少的版本,只有一个未定义行为的实例:
short *
这是一个正确的版本,应该打印相同的值:
short a, *pt = &a;
printf("%p, %p\n", (void*)&a, (void*)pt);
scanf("%d", &a);
printf("%p, %p\n", (void*)&a, (void*)pt);