将指向整数的指针强制转换为指向char的指针时会发生什么?

vas*_*vas 6 c casting

int i=40;
char *p;
p=(char *)&i;//What actually happens here?
printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)

什么是输出?请帮忙!

sep*_*p2k 7

p=(char *)&i;//What actually happens here?
Run Code Online (Sandbox Code Playgroud)

它获取地址i并将其转换为char指针.所以*p现在的值是第一个字节i.这个价值是什么,取决于平台.

  • 最有可能是0或40(取决于机器的字节顺序). (4认同)

Joh*_*ode 5

让我们先看看在如何内容启动ip在内存中会进行布局(假设大端顺序):

Item               Address               0x00  0x01  0x02  0x03
----               -------               ----------------------
   i               0x08000000            0x00  0x00  0x00  0x28
   p               0x08000004            0x??  0x??  0x??  0x??

由于p被声明为自动变量,因此它不会初始化为任何内容,并且包含由...表示的随机位模式0x??.

在线

p = (char *)&i;
Run Code Online (Sandbox Code Playgroud)

表达式&i求值为地址i,或0x08000000,其类型为pointer to int,或int *.强制转换将类型转换int *char *,并将结果分配给p.

以下是赋值后内存中的内容:

Item               Address               0x00  0x01  0x02  0x03
----               -------               ----------------------
   i               0x08000000            0x00  0x00  0x00  0x28
   p               0x08000004            0x08  0x00  0x00  0x00

所以价值p是现在的地址i.在线

printf("%d", *p);
Run Code Online (Sandbox Code Playgroud)

表达式的类型*pchar,它的值是存储在地址0x08000000中的任何值,在这种特殊情况下是0.由于printf是可变函数,因此值*p从类型提升char到类型int.

因此对于这种特殊情况,输出为"0".如果订单是little-endian,那么地图就会像

Item               Address               0x03  0x02  0x01  0x00
----               -------               ----------------------
   i               0x08000000            0x00  0x00  0x00  0x28
   p               0x08000004            0x08  0x00  0x00  0x00

输出将是"40".

请注意,整个示例假设整数和字符指针具有相同的大小和布局; 这并不能保证在任何地方都是真实的(参见在线C标准(n1256草案),第6.2.5节,第27段),所以你不能以你期望的方式依赖于这种工作(假设我认为这是正确的)int并且char不是标准定义的兼容类型,但我可能错了).一般来说,打字是不安全的.


Jig*_*shi 2

给你

int i = 40;//为整数i分配内存并为其赋值40

char *p = (char*)&i; 
Run Code Online (Sandbox Code Playgroud)

所以在这里你定义一个指针变量,并在将其转换为 i 后为其分配 i 的地址char*

假设i分配在,1021 address所以 p 将具有该地址,限制为 1 个字节,因此它应该保存 first 8 bit from the representation of 40;

由于 40 已被覆盖在 2 字节的前 8 位下,因此它将保存相当于 40 的字符,但当您用它打印时,它%d应该打印40