【问题标题】:SEGFAULT on strcpystrcpy 上的 SEGFAULT
【发布时间】:2016-03-17 16:42:41
【问题描述】:

我有一个以

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

然后调用另一个开头为的函数

void fixErrors(int lineIndex, char *word){
  char *line;
  strcpy(line, lines[lineIndex]);

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

更改,问题就会消失
char *line;

char line[255];

但我不希望在一条大线上出现另一个段错误。我想我也可以

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

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

【问题讨论】:

  • char *line = malloc(strlen(lines[lineIndex])) 不够用,因为结尾为空字符,您还需要一个字符。
  • 您有一个未初始化的指针,并且使用包括指针在内的未初始化变量具有未定义的行为。
  • is this a bad way to use the function and i'm simply getting lucky on the first function...是的,大部分时间。
  • malloc (strlen (x)) 实际上 always 没有“+1”是错误的,应该是编译器检查模式...... . 只要不是,任何程序员都应该检查 ;) 更安全的做法是 strdup(x)
  • @Sourav 我不认为有一个错误的程序会带来好运。我宁愿我的错误程序永远不会起作用。如果没有系统地阻止程序运行,发现故障通常很痛苦。

标签: c


【解决方案1】:
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?

因为我们还需要一个字符作为零终止符。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2017-09-17
    相关资源
    最近更新 更多