我正在学习 C。当我浏览那里的指针时,我注意到一些我无法理解的奇怪行为。将字符指针转换为整数指针时,整数指针持有一些奇怪的值,与 char 或 char ascii 代码没有合理关系。但是在使用 '%c' 打印转换变量时,它会打印正确的 char 值。
使用“%d”打印给出了一些未知的数字。
printf("%d", *pt); // prints as unknown integer value that too changes for every run
但是当打印为 '%c' 时
printf("%c", *pt); // prints correct casted char value
整个程序:
int main() {
char f = 'a';
int *pt = (int *)&f;
printf("%d\n", *pt);
printf("%c\n", *pt);
return 0;
}
请解释 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;
}
输出:
97
a
97
a
也请解释此行为。
对于 C 语言指定的内容,这只是普通的未定义行为。你有一个 char
您正在读取 int
的内存区域大小;结果未定义。
至于可能发生的情况:C 运行时最终会在 main
之前将一些随机垃圾转储到堆栈中。甚至被执行。 char f = 'a';
碰巧将垃圾的一个字节重写为已知值,但填充对齐 pt
意味着剩余的字节根本不会被重写,并且其中包含“运行时留下的任何内容”。所以当你读到 int
out,在小端系统上,低字节等于'a'
的值, 但高字节是恰好留在填充空间中的垃圾。
至于为什么%c
有效,因为低字节仍然相同,并且 %c
只检查 int
的低字节前提是,所有的垃圾都被忽略了,一切都按预期进行。不过,这只适用于小端机器;在大端机器上,它将是初始化为 'a'
的 high 字节, 但低字节(垃圾)将由 %c
打印.
我是一名优秀的程序员,十分优秀!