所以我有一个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


这似乎已被覆盖。有人可以解释为什么吗?

最佳答案

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

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

   token = strtok(copyLine, DELIM);


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

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

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

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

09-25 21:27