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

为何我的C程序无论输入什么都会触发Segmentation Fault?

C程序段错误与未初始化值问题排查

我已经花了好几个小时绞尽脑汁,却始终搞不懂这段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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:12:32