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

使用printf的%s格式符输出时触发段错误的原因是什么?

为什么printf("%s", argv[1][a-1])会触发段错误?

这问题挺典型的,我来给你拆解清楚背后的原因,以及对应的解决办法:

核心原因:格式符与参数类型不匹配

printf的%s格式符有严格的要求——它需要对应的参数是一个指向以空字符\0结尾的字符数组的指针。但你传递的argv[1][a-1]是什么呢?它是字符串argv[1]的最后一个字符,是单个char类型的值(比如你例子里的'w',ASCII码是119)。

当printf看到%s时,会把这个字符值当成内存地址去处理,试图从这个地址开始读取字符直到遇到\0。但119这个地址根本不属于你的程序可访问的内存空间,操作系统就会触发段错误来阻止非法内存访问。

两种解决办法

1. 传递指向最后一个字符的指针

如果你想输出从最后一个字符开始到字符串结尾的内容(这里其实就是单个字符加结束符),可以传递该字符的地址:

printf("%s\n", &argv[1][a-1]);

或者先把字符串存到指针变量里,再取对应位置的地址:

char *ptr = argv[1];
printf("%s\n", &ptr[a-1]);

这时候传递的是合法的内存地址(字符串最后一个字符的位置),printf从这里开始读,刚好能读到原字符串的结束符\0,就能正确输出了。

2. 用%c格式符直接输出单个字符

如果你的需求本来就是只输出最后一个字符,那直接用对应单个字符的%c格式符是最直接的,这也是你第一行printf能正常工作的原因:

printf("%c\n", argv[1][a-1]); 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:10:24