Execvp内存错误

时间:2017-11-01 04:58:13

标签: c memory-leaks

所以我有一个c程序接受命令输入但偶尔我似乎得到某种内存错误。

我如何阅读输入:

static void parseLine(char* commandLine, Sequence* sequences, int* seqSize) {
   char copyLine[MAX_LENGTH];
   char* token;

   strcpy(copyLine, commandLine);

   token = strtok(copyLine, DELIM);

   while (token != NULL) { /* updates args here */


   }
}

我在调用上面的函数之前打印出我的Sequence参数,并且一切似乎都很好。使用Valgrind我得到以下内容(执行中):

Invalid read of size 1

我打电话的命令是

cat aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test

然而,当我的程序失败时,它打印出来:

cat: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaD: No such file or directory

这似乎正在被覆盖。有人可以解释原因吗?

1 个答案:

答案 0 :(得分:1)

在函数parseLine中,将参数复制到局部变量中,然后传递给strtok

   char copyLine[MAX_LENGTH];
   ...
   strcpy(copyLine, commandLine);

   token = strtok(copyLine, DELIM);

然后将结果指针存储在args中,然后用它来初始化结构。

请注意,strtok返回指向所提供缓冲区内每个标记开头的指针,因此在局部变量copyLine内。局部变量只能在声明它们的函数内引用,如果稍后在从函数返回后引用那些指针,则结果是未定义的。

您正在makeSequence内复制,但是您正在复制指针数组,而不是指针指向的字符串!

要避免这种情况,请在堆上分配copyLine(稍后释放)或从外部传递。