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

C语言面试疑问:指针字符串printf语句1、3、7的输出及原因解析

面试C语言代码printf输出解析求助

最近面试碰到一段C语言代码,要求分析每个printf的输出结果。我自己在注释里写了部分答案,但对其中的语句1、3、7的输出拿不准,想请大佬帮忙解析下这三个语句的输出结果和背后的原因。贴出的代码(部分)如下:

#include <stdio.h> 
int main(int argc, const char * argv[]) { 
    char *s = "12345"; 
    printf("%d\n", s); // 1.输出"3999",这是首指针的地址吗? 
    printf("%d\n", *s); // 2.首字符的十进制值...
    // 原代码中语句3、7未完整粘贴,以下结合常见面试场景补充解析
}

语句1:printf("%d\n", s);

你的猜测方向没错,但这里有个关键问题:这种写法属于未定义行为。s是char*类型的指针,存储的是字符串常量"12345"首字符的内存地址。但%d是用来打印十进制整数的格式符,C标准明确要求打印指针必须用%p(通常输出十六进制地址)。

你看到的3999,其实是这个首地址被强制转换成int类型后的十进制数值,这个值完全依赖于当前系统的内存布局和位数(比如32位系统下指针占4字节,64位下占8字节),换个环境输出肯定不一样。实际开发中绝对不能这么写,属于错误用法。

语句3:(结合面试常见场景,假设是printf("%s\n", s);或printf("%d\n", s+1);)

如果是printf("%s\n", s);:

  • 输出是完整的字符串12345。因为%s格式符会从指针指向的地址开始,逐个打印字符,直到遇到字符串末尾的\0结束符(字符串常量会自动在末尾添加这个结束符)。
    如果是printf("%d\n", s+1);:
  • 这是指针算术运算,s+1会指向字符串第二个字符'2'的内存地址。同样用%d打印属于未定义行为,输出的是该地址转成int后的十进制值——比如如果s的地址是3999,那s+1就是4000(因为char类型占1字节,指针加1偏移1字节)。

语句7:(结合面试常见场景,假设是printf("%c\n", *(s+2));或printf("%d\n", strlen(s));)

如果是printf("%c\n", *(s+2));:

  • 输出是字符'3'。s+2指向字符串第三个字符的地址,解引用*(s+2)得到该位置的字符,%c格式符会直接打印对应的ASCII字符。
    如果是printf("%d\n", strlen(s));:
  • 输出是5。strlen函数会计算字符串中\0结束符之前的字符个数,"12345"刚好有5个字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:25:26