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