c - Execvp 内存错误

标签 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 */


   }
}

在调用上面的函数之前,我打印出了我的序列参数,一切似乎都很好。使用 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(并稍后释放它)或从外部传入它。

关于c - Execvp 内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47048492/

相关文章:

ios - 如何在 iOS 中发布 CGImageRef

Java 句柄(互斥锁?)被泄露且未被释放(不是文件句柄)

ios - 有没有人成功使用 valgrind 来检查 iOS 的内存问题?

c++ - 静态库如何链接到依赖项?

c - 我对输出文件执行 "rm"后,C 程序将输出写入哪里?

c - 重新排列字符串字母

c - 标准输入缓冲区如何工作?

c - 如何在没有特殊库的情况下读取 C 中的原始图像?

python - MoviePy VideoFileClip 实例没有属性 'reader'

javascript - 如何正确处理 Three.js 场景? (r55)