代码:
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;
}输出:
(rsp)0xffffcbe0
(temp)0xffffcbe0
(void*)(rsp)0xffffffffffffcbe0
(void*)(temp)0xffffffffffffcbe0我怀疑这是一个愚蠢的问题,但是为什么指针的值在转换后会改变呢?我试着转换成不同的类型,并且总是得到相同的偏移量。谢谢。
发布于 2016-09-10 15:35:53
但是为什么指针的值在转换后会发生变化呢?
int和rsp是int,而不是指针。
使用"%p"是int中未定义的行为。
printf("\n (rsp)%p \n", rsp); // UB
printf("\n (temp)%p \n", temp); // UB然而,让我们假设值,转换为unsigned是由OP打印的。
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值的锁存打印说明符,因此可以按以下方式进行转换。
#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);https://stackoverflow.com/questions/39427206
复制相似问题