首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么指针的值在转换后会改变?

为什么指针的值在转换后会改变?
EN

Stack Overflow用户
提问于 2016-09-10 14:49:03
回答 1查看 514关注 0票数 1

代码:

代码语言:javascript
复制
int main(void) {
register int rsp asm("rsp");
int temp=rsp;

printf("\n (rsp)%p \n", rsp);
printf("\n (temp)%p \n", temp);
printf("\n (void*)(rsp)%p \n", (void*)rsp );
printf("\n (void*)(temp)%p \n", (void*)temp );

return 0;
}

输出:

代码语言:javascript
复制
 (rsp)0xffffcbe0

 (temp)0xffffcbe0

 (void*)(rsp)0xffffffffffffcbe0

 (void*)(temp)0xffffffffffffcbe0

我怀疑这是一个愚蠢的问题,但是为什么指针的值在转换后会改变呢?我试着转换成不同的类型,并且总是得到相同的偏移量。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-10 15:35:53

但是为什么指针的值在转换后会发生变化呢?

intrspint,而不是指针。

使用"%p"int中未定义的行为。

代码语言:javascript
复制
printf("\n (rsp)%p \n", rsp);   // UB
printf("\n (temp)%p \n", temp); // UB

然而,让我们假设值,转换为unsigned是由OP打印的。

代码语言:javascript
复制
printf("\n (rsp)0x%x \n", (unsigned) rsp);   // (rsp)0xffffcbe0
printf("\n (temp)0x%x \n", (unsigned) temp); // (temp)0xffffcbe0

当代码像在int中那样隐藏指向register int rsp asm("rsp");的指针时,它可能失去显着性@David Wohlferd。当将int转换为指针时,会出现各种转换机制,比如符号扩展来处理狭窄的int"%p"具有特定于实现的格式。

需要明确的是:OP的代码肯定不会打印原始asm("rsp")的地址。(编译器特定的扩展)。

C提供可选的整数类型(u)intptr_t,该类型提供从/到等效整数和对象指针的转换。若要将对象指针保存为整数,请使用这些类型。不幸的是,C缺乏用于打印非void*指针和(u)intptr_t值的锁存打印说明符,因此可以按以下方式进行转换。

代码语言:javascript
复制
#include <stdint.h>
#include <stdio.h>

char *s = "rsp";
printf("pointer %p\n", (void *) s);

uintptr_t i_ptr = (uintptr_t) s;
printf("integer 0x%jX\n", (uintmax_t) i_ptr);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39427206

复制
相关文章

相似问题

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