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

内存值相同的字符串与整数为何打印结果不同?

问题:字符串与整数以%d打印结果不同的原因

我正在学习《Learn C the Hard Way》,书中作者常让学生故意“破坏”示例来学习调试。在练习11中,要求尝试将字符串当作整数打印。但在以下代码中,当name和number都以整数格式打印时,输出结果为何不同?

简化后的代码

#include <stdio.h>

int main() {
   // 根据我写的简陋Python代码,这应该等于5318008。
   char name[4] = {'x', '%', 'Q', 0};
   int number = 5318008;
   printf("%d\n", name);
   printf("%d\n", number);
   return 0;
}

运行输出

% ./temp
1962793460
5318008

GDB调试输出

% gdb --quiet ./temp
Reading symbols from ./temp...
(gdb) break 7
Breakpoint 1 at 0x116e: file ./temp.c, line 7.
(gdb) run
Starting program: /home/asdfadf/Documents/c/temp

This GDB supports auto-downloading debuginfo from the following URLs:
  <https://debuginfod.archlinux.org>
Enable debuginfod for this session? (y or [n])
Debuginfod has been disabled.
To make this setting permanent, add 'set debuginfod enabled off' to .gdbinit.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".

Breakpoint 1, main () at ./temp.c:7
7          printf("%d\n", name);
(gdb) x/4xb &name
0x7fffffffd9e4: 0x78    0x25    0x51    0x00
(gdb) x/4xb &number
0x7fffffffd9e0: 0x78    0x25    0x51    0x00
(gdb)

原因分析

  • 核心错误:printf("%d", name)打印的不是数组内容,而是数组name的内存地址。C语言中数组名作为函数参数时会自动退化为指向首元素的指针,这里传递给printf的是&name[0](即地址0x7fffffffd9e4),而非数组里的字节数据。
  • 内存值解析:
    • number的内存字节是0x78 0x25 0x51 0x00,x86架构默认小端字节序,组合成整数是0x00512578,转十进制就是5318008,和设置值一致。
    • name的地址0x7fffffffd9e4转十进制就是1962793460,对应第一个输出。
  • 如果想把name的内容当作整数打印,需要强制类型转换:printf("%d\n", *(int*)name);,这样才会把数组首地址开始的4个字节当作int解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:16:12