strcpy上的SEGFAULT

strcpy上的SEGFAULT,c,C,我有一个函数,它的开头是 void findErrors(int lineIndex){ char *line; strcpy(line, lines[lineIndex]); 然后调用另一个以 void fixErrors(int lineIndex, char *word){ char *line; strcpy(line, lines[lineIndex]); 第一个函数起作用,但当它调用第二个函数时,我得到一个segfault。lineIndex对于Word和find

我有一个函数,它的开头是

void findErrors(int lineIndex){
  char *line;
  strcpy(line, lines[lineIndex]);
然后调用另一个以

void fixErrors(int lineIndex, char *word){
  char *line;
  strcpy(line, lines[lineIndex]);
第一个函数起作用,但当它调用第二个函数时,我得到一个segfault。lineIndex对于Word和findErrors都是相同的,除了在strcpy()中,findErrors不调用lines数组。为什么会这样?这是一个糟糕的使用函数的方法,而我只是在第一个函数上运气好?如果我更改fixErrors中的行,问题就会消失

char *line;

但我不希望在一条大线路上出现另一个故障。我想我也可以

char *line = malloc(strlen(lines[lineIndex])+1)
但我真的很好奇为什么第一种方法不起作用

void findErrors(int lineIndex){
  char *line;
  strcpy(line, lines[lineIndex]);
//^ this is undefined behaviour.
此时,
未初始化,将某些内容复制到未初始化的指针会导致未定义的行为,通常是segfault

但是,如果碰巧
指向某个有效内存,程序可能不会崩溃,并且看起来可能正常工作。这是未定义的行为

工作情况:

void findErrors(int lineIndex){
  char line[255];
  strcpy(line, lines[lineIndex]);
此处
指向长度为255的缓冲区。只要源字符串的长度小于254,就可以将strcpy
strcpy
复制到此缓冲区而不会出现问题

为什么“小于254”而不是255


因为我们需要为零终止符再添加一个字符。

char*line=malloc(strlen(lines[lineIndex]))
不够,因为结尾为空字符,所以您需要多添加一个字符。您有一个未初始化的指针,使用未初始化的变量(包括指针)具有未定义的行为。
这是一种使用函数的糟糕方式吗?我只是在第一个函数上运气不错。
…是的,大多数情况下。malloc(strlen(x))在没有“+1”的情况下实际上总是错误的,应该是编译器检查模式。。。。。只要不是,任何程序员都应该检查;)一个更安全的做法是增加(X)@ SoVAV,我不认为有一个错误的程序是运气。我宁愿我的错误程序永远不起作用。当没有系统性地阻止程序工作时,发现小故障通常是一件痛苦的事情。
void findErrors(int lineIndex){
  char line[255];
  strcpy(line, lines[lineIndex]);