短指针地址如何在scanf中工作

时间:2018-04-19 15:39:49

标签: c

*head

我想知道在使用scanf之后导致指针地址改变的原因。我知道我应该使用%hd来读取short int但是我只是想知道导致指针地址变化的原因是什么?另外为什么每次运行都会导致指针具有不同的地址长度以短地址?我首先想到的是因为初始读取短地址的大小然后是int的地址,但两个地址之间的差异总是不同。

这只是一种未定义的行为吗?

1 个答案:

答案 0 :(得分:1)

要使用short int阅读scanf,请使用h尺寸修饰符:

scanf("%hd",&a);

您的代码具有未定义的行为:scanfstdin读取一个整数,并将其存储为int地址a。由于ashort,很可能小于架构上的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);