integer可以被类型转换为指向integer的指针

Can integer be typecast to pointer to integer?

本文关键字:integer 指针 类型转换      更新时间:2023-10-16

int强制转换为int*有效吗?如果是,这意味着什么?如果没有,问题出在哪里?

int a=10;
printf("%d", (int *)a);

只是a而不是&a。它在devc++中打印10。(int *)a不是指指向地址10的指针,而不是指向存储值10的某个地址的指针吗?

啊!我还是很困惑。我还有一种情况想不通。

int b=516
printf("\n%d",((char*)b));

它打印516。它不应该印4吗?请解释。

根据C标准(6.3.2.3指针)

5整数可以转换为任何指针类型。除了先前指定,结果是实现定义的,可能不是正确对齐,可能未指向引用的实体类型,并且可能是陷阱表示。67)

在您的代码片段中

int a=10;
printf("%d", (int *)a);

指针(int *)a可能没有正确对齐,例如当sizeof(int*)等于4或8时。还要考虑到printf 的调用

printf("%d", (int *)a);

具有未定义的行为,

根据C标准(7.21.6.1 fprintf函数-同样适用于printf)

9如果转换规范无效,则行为为未定义.275)如果任何参数不是相应的转换规范,行为是未定义的。

关于这个代码片段

int b=516;
printf("n %d",((char *)b)); 

则编译器在函数printf内部推送堆栈值516作为地址,并且由于格式说明符CCD_。

是的,您可以将整数强制转换为指针,但语义取决于上下文。整数的位模式将被解释为地址,该地址可能有效也可能无效。

您的示例没有什么意义,虽然(int*)a是一个等于0xA的地址,但%d格式说明符会导致printf()在任何情况下将该值解释为整数——这就是为什么它打印10,但作为地址,它仍然具有值10——即使该地址无效。

考虑:

int a = 10 ;
intptr_t p = (int)&a ; // cast a valid pointer to integer 
                       // large enough to hold an address
int ap = (int*)a ;     // a reinterpreted as a pointer
printf( "%dn", a ) ;           // Print a
printf( "%pn", &a ) ;          // Print address of a
printf( "%d (0x%X)n", p, p ) ; // Print p - an integer equal to &a
printf( "%pn", ap ) ;          // Print ap - a interpreted as a pointer

intint*的强制转换未定义。这意味着任何事情都可能发生。可能发生的是,它将指向索引为10的内存块,无论这意味着什么。一些编译器可以实现为intint*具有不同的大小,这将导致不同的问题。

知道吗,如果你运气好,(int *)a指向地址10,你想看看那里有什么,你可以用取消引用它

printf("%d", *(int *)a);

警告:这可能/可能/可能导致类似于忘记malloc内存的分段故障。

TL;DR:不要这么做。