为何我的C程序无论输入什么都会触发Segmentation Fault?
我已经花了好几个小时绞尽脑汁,却始终搞不懂这段C程序为何无法正常运行。以下是我的代码:
#include <stdio.h> #define MAXLINE 1000 #define TRUE 1 #define FALSE 0 int getLine(char s[], int lim); void copy(char to[], char from[]); void add(char to[], char from[], int max); int main(){ int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; len = 0; while(( len = getLine(line, MAXLINE)) > 0){ if(max == len){ add(longest, line, max); } if (len > max){ max = len; copy(longest, line); } } if (max > 0){ printf("%s", longest); } return 0; } int getLine(char s[], int lim){ int c, i; for (int state = FALSE, i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n';){ if(c == '\t' || c == ' ' && state == TRUE) continue; if (c == '\t' || c == ' '){ s[i] = c; ++i; state = TRUE; } else { s[i] = c; state = FALSE; ++i; } } if (c == '\n'){ s[i] = c; ++i; } s[i] = '\0'; return i; } void copy(char to[], char from[]){ int i = 0; while((to[i] = from[i]) != '\0'){ ++i; } } void add(char to[], char from[], int max){ if (max != 0){ int control = max * 2; to[max] = from[0]; ++max; for(int i = 1; max <= control; ++max, ++i ){ to[max] = from[i]; }; }; }
我是不是遗漏了什么?我用Valgrind运行后得到如下结果:
22786 Memcheck, a memory error detector
22786 Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
22786 使用Valgrind-3.18.1和LibVEX;重新运行加-h查看版权信息
22786 命令:./maxLine
22786
输入as后:
22786 使用了大小为8的未初始化值
22786 位于 0x10933A: getLine
22786 由 0x109230: main 调用
22786
22786 使用了大小为8的未初始化值
22786 位于 0x10934D: getLine
22786 由 0x109230: main 调用
22786
22786 条件跳转或移动依赖于未初始化值
22786 位于 0x10923E: main
22786
22786 条件跳转或移动依赖于未初始化值
22786 位于 0x1091C9: main
22786
22786 条件跳转或移动依赖于未初始化值
22786 位于 0x1091F6: main
22786
22786 条件跳转或移动依赖于未初始化值
22786 位于 0x109396: copy
22786 由 0x10921C: main 调用
22786
在gdb中调试时:
[已启用使用libthread_db的线程调试]
使用主机libthread_db库"/lib/x86_64-linux-gnu/libthread_db.so.1"。
输入as后:
程序收到信号SIGSEGV,出现Segmentation Fault(段错误)。
0x000055555555533a in getLine (s=0x7fffffffd7e0 "as\377\367\377\177", lim=1000) at maxLine.c:53
53 s[i] = c;
(gdb) backtrace
#0 0x000055555555533a in getLine (s=0x7fffffffd7e0 "as\377\367\377\177", lim=1000) at maxLine.c:53
#1 0x0000555555555231 in main () at maxLine.c:18
我完全不知道该从何处着手排查这个问题。
内容的提问来源于stack exchange,提问作者JERVIS JAMES PEDOTIM

