内存值相同的字符串与整数为何打印结果不同?
问题:字符串与整数以%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
相关产品推荐
相关产品推荐

