如何将char指针转换为int指针?

Vig*_*ran 0 c pointers casting char

我正在学习C。当我经过指针时,我注意到一些奇怪的行为,我无法理解。当将字符指针转换为整数指针时,整数指针持有一些怪异的值,在与char或char ascii代码合理相关的地方没有。但是,在用'%c'打印强制转换变量时,它会打印正确的char值。

用'%d'打印会给出一些未知的数字。

printf("%d", *pt); // prints as unknown integer value that too changes for every run
Run Code Online (Sandbox Code Playgroud)

但是当打印为'%c'时

printf("%c", *pt); // prints correct casted char value
Run Code Online (Sandbox Code Playgroud)

整个程序:

int main() {

char f = 'a';
int *pt = (int *)&f;

printf("%d\n", *pt);
printf("%c\n", *pt);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

请说明char到int指针强制转换的工作原理,并说明输出值。

编辑:

如果我对程序进行以下更改,则输出将如预期的那样。请也解释一下。

#include <stdio.h>

int main() {

char f = 'a';
int *pt = (int *)&f;

printf("%d\n", *pt);
printf("%c\n", *pt);

int val = (int)f;
printf("%d\n", val);
printf("%c", val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

97
a
97
a
Run Code Online (Sandbox Code Playgroud)

请也解释这种行为。

Sha*_*ger 5

对于C语言指定的内容,这只是简单的未定义行为。您有一个char大小适中的内存区域,您可以从中读取内容int;结果是不确定的。

至于可能发生的情况:C运行时最终在main执行之前将一些随机垃圾转储到堆栈中。char f = 'a';碰巧将垃圾的一个字节重写为一个已知值,但是要对齐的填充pt意味着剩余的字节根本不会被重写,并且在其中保留了“无论运行时间如何”。因此,当您int在小端系统上读取输出时,低字节等于的值'a',但是高字节是填充空间中可能留下的任何垃圾。

至于为什么%c起作用,由于低字节仍然是相同的,并且%c仅检查提供的低字节,因此int所有垃圾都将被忽略,并且事情按预期进行。不过,这仅适用于小端机。在大字节序机器上,它将是初始化为的字节'a',但低字节(垃圾)将由打印%c