SEGFAULT on strcpy

时间:2016-03-17 16:42:42

标签: c

我有一个以

开头的功能
void findErrors(int lineIndex){
  char *line;
  strcpy(line, lines[lineIndex]);

然后调用另一个以

开头的函数
void fixErrors(int lineIndex, char *word){
  char *line;
  strcpy(line, lines[lineIndex]);

第一个函数有效,但是当它调用第二个函数时我得到一个段错误。对于这两个单词,lineIndex是相同的,并且除strcpy()外,findErrors不会调用lines数组。为什么会这样?这是一个使用该功能的坏方法,我只是在第一个功能上获得幸运吗?如果我从

更改fixErrors中的行,问题就会消失
char *line;

char line[255];

但我宁愿没有可能在一条巨大的线路上发生另一次段错误。我想我也可以

char *line = malloc(strlen(lines[lineIndex])+1)

但我真的好奇为什么第一种方式不起作用。

1 个答案:

答案 0 :(得分:0)

void findErrors(int lineIndex){
  char *line;
  strcpy(line, lines[lineIndex]);
//^ this is undefined behaviour.

此时line未初始化并且将某些内容绑定到非初始化指针会导致未定义的行为,通常是段错误。

但是如果偶然line指向一些有效的内存,程序可能不会崩溃,看起来好像有效。这是未定义的行为。

工作原理:

void findErrors(int lineIndex){
  char line[255];
  strcpy(line, lines[lineIndex]);

此处line指向长度为255的缓冲区。只要源字符串的长度小于254,您就可以strcpy到此缓冲区而不会出现问题。

为什么"小于254"而不是255?

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