字符串逆序拷贝至数组时出现exit status 116错误,求原因
嘿,我来帮你排查代码里的问题啦!你遇到的exit status 116其实是内存访问越界引发的错误,咱们一步步拆解问题根源:
核心错误分析
1. 空数组定义非法
你写的char notreversed[] = {};是不符合C语言规范的:局部数组不能定义为空(既没有元素也未指定大小)。当你用scanf("%s", notreversed)写入字符串时,会直接越界覆盖内存中的其他数据,这是导致程序崩溃的核心原因之一。
2. 数组索引越界
循环里的reversed[i] = notreversed[length-i];存在索引错误:C语言字符串的索引从0开始,比如长度为4的"stop",有效索引是0到3。当i=0时,length-i等于4,已经超出了原数组的最大索引,属于非法内存访问,会读取垃圾数据甚至触发错误。正确的索引应该是length - 1 - i。
3. 缺少字符串终止符
C语言的字符串必须以'\0'结尾,但你定义的reversed[length]只分配了和原字符串等长的空间,循环结束后没有手动添加终止符。printf("%s")会一直读取内存直到遇到'\0',这会导致不可预料的行为。
修正后的代码
#include <stdio.h> #include <string.h> int main(){ // 定义足够大的固定大小数组,避免输入越界 char notreversed[100]; int i, length; // 限制读取字符数,防止超出数组容量 scanf("%99s", notreversed); length = strlen(notreversed); // 多分配1个空间存储字符串终止符 char reversed[length + 1]; for(i=0; i<length ; i++ ){ reversed[i] = notreversed[length - 1 - i]; } // 添加字符串终止符,确保printf能正确识别 reversed[length] = '\0'; printf("%s\n", reversed); return 0; }
额外小提示
- 如果需要处理超长字符串,可以改用动态内存分配(
malloc和free)替代变长数组,兼容性更好。 - 始终注意输入边界,用
scanf("%99s")这种方式限制读取长度,能有效避免内存越界问题。
内容的提问来源于stack exchange,提问作者KittyCat
相关产品推荐
相关产品推荐

