gpt4 book ai didi

c - scanf中短指针地址如何工作

转载 作者:行者123 更新时间:2023-11-30 14:49:07 26 4
gpt4 key购买 nike

short a,*pt=&a;
printf("%x, %p\n",&a,pt);
scanf("%d",&a);
printf("%x, %p\n",&a,pt);

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

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

最佳答案

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

scanf("%hd",&a);

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

另请注意,使用 %x 打印指针也具有未定义的行为,并且格式 %p 需要 void *,这可能是传递方式与 short * 不同,实际上这些类型在某些体系结构(例如较旧的 Cray super 计算机)上有不同的表示形式。

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

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);

关于c - scanf中短指针地址如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49925065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com