You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中char指针强制转为int指针后输出异常的原因

为何这段代码输出整数而非字符的ASCII码?

先看问题中的代码:

int main() {
    const char *p = "a";
    int *a = (int *) p;
    printf("%d", *a);
}

这段代码运行后输出1680146529,而非字符'a'的ASCII码97;将字符串改为"b"时,输出结果的十进制末尾两位从29变为30;改为"abcd"时,输出为1684234849。

原因分析

核心在于强制类型转换后的内存读取逻辑:

  • 当你把const char*强制转换为int*后,*a读取的是从p指向的地址开始的连续4字节内存(取决于系统中int的长度,通常为4字节),并将其解析为一个整数。
  • 字符串在内存中是连续存储的:比如"a"实际存储为'a'(十六进制0x61) + '\0'(十六进制0x00),再加上内存中后续的填充字节,这4个字节会按照系统的小端字节序拼接成一个整数(小端模式下,低地址的字节对应整数的低位),最终输出这个整数的十进制形式。
  • 当字符串改为"b"时,'b'的ASCII码是0x62,替换了原0x61的位置,对应整数的低位部分发生变化,所以输出的末尾两位随之改变;当字符串是"abcd"时,4个字符刚好填满4字节的int空间,此时读取的就是'a'、'b'、'c'、'd'四个字符的ASCII码按小端顺序组成的整数。

这种通过读取连续内存字节生成整数的逻辑,曾在pwnable.kr的collision挑战中被用于生成哈希值。

内容的提问来源于stack exchange,提问作者Ferrrerero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:20:00