short a,*pt=&a;
printf("%x, %p\n",&a,pt);
scanf("%d",&a);
printf("%x, %p\n",&a,pt);
我想知道是什么原因导致指针地址在使用scanf后发生变化。我知道我应该使用%hd来读取简写int,但我只是想知道是什么导致指针地址改变?还有为什么每次运行都会导致指针有不同的地址长度来缩短int的地址?我最初认为这是因为最初读取short地址的大小,然后读取int地址的大小,但两个地址之间的差异总是不同的。
这仅仅是一种未定义的行为吗?
发布于 2018-04-19 15:43:22
要使用scanf
读取short int
,请使用h
大小修饰符:
scanf("%hd",&a);
您的代码具有未定义的行为:scanf
从stdin
读取一个整数,并将其作为int
存储到a
的地址中。因为a
是一个short
,很可能比你的架构上的int
小,所以scanf
修改的一些字节属于另一个对象,可能是你看到的修改过的指针pt
,尽管由于对齐限制,这不太可能。
还请注意,使用%x
打印指针也有未定义的行为,格式%p
需要void *
,它可能与short *
不同地传递,实际上,这些类型在某些体系结构上具有不同的表示形式,例如较旧的克雷超级计算机。
这是一个问题较少的版本,只有一个未定义行为的实例:
short a, *pt = &a;
printf("%p, %p\n", (void*)&a, (void*)pt);
scanf("%d", &a);
printf("%p, %p\n", (void*)&a, (void*)pt);
下面是一个正确的版本,它应该打印相同的值:
short a, *pt = &a;
printf("%p, %p\n", (void*)&a, (void*)pt);
scanf("%hd", &a);
printf("%p, %p\n", (void*)&a, (void*)pt);
https://stackoverflow.com/questions/49925065
复制相似问题