使用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
相关产品推荐
相关产品推荐

