首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >短指针地址在scanf中是如何工作的

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

Stack Overflow用户
提问于 2018-04-19 23:39:49
回答 1查看 297关注 0票数 0
代码语言:javascript
代码运行次数:0
运行
复制
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地址的大小,但两个地址之间的差异总是不同的。

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

EN

回答 1

Stack Overflow用户

发布于 2018-04-19 23:43:22

要使用scanf读取short int,请使用h大小修饰符:

代码语言:javascript
代码运行次数:0
运行
复制
scanf("%hd",&a);

您的代码具有未定义的行为:scanfstdin读取一个整数,并将其作为int存储到a的地址中。因为a是一个short,很可能比你的架构上的int小,所以scanf修改的一些字节属于另一个对象,可能是你看到的修改过的指针pt,尽管由于对齐限制,这不太可能。

还请注意,使用%x打印指针也有未定义的行为,格式%p需要void *,它可能与short *不同地传递,实际上,这些类型在某些体系结构上具有不同的表示形式,例如较旧的克雷超级计算机。

这是一个问题较少的版本,只有一个未定义行为的实例:

代码语言:javascript
代码运行次数:0
运行
复制
short a, *pt = &a;
printf("%p, %p\n", (void*)&a, (void*)pt);
scanf("%d", &a);
printf("%p, %p\n", (void*)&a, (void*)pt);

下面是一个正确的版本,它应该打印相同的值:

代码语言:javascript
代码运行次数:0
运行
复制
short a, *pt = &a;
printf("%p, %p\n", (void*)&a, (void*)pt);
scanf("%hd", &a);
printf("%p, %p\n", (void*)&a, (void*)pt);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49925065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档