因此,我有一个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 */
}
}在调用上面的函数之前,我会打印出我的序列参数,这一切似乎都很好。通过使用Val差伦,我得到了以下内容(在执行中):
Invalid read of size 1我呼叫的命令是
cat aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test但是,当我的程序失败时,它会打印出:
cat: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaD: No such file or directory这似乎被改写了。谁能解释一下原因吗?
发布于 2017-11-01 05:45:49
在函数parseLine中,将参数复制到局部变量中,然后传递给strtok
char copyLine[MAX_LENGTH];
...
strcpy(copyLine, commandLine);
token = strtok(copyLine, DELIM);然后将结果指针存储在args中,然后使用该指针初始化结构。
注意,strtok返回指向所提供缓冲区内每个令牌的开头的指针,在局部变量copyLine中也是如此。局部变量只能在声明它们的函数中引用,如果稍后从函数返回后引用这些指针,则结果是未定义的。
您正在makeSequence中复制一个副本,但是您复制的是指针数组,而不是指针所指向的字符串!
为了避免这种情况,要么在堆上分配copyLine (稍后释放它),要么从外部传递它。
https://stackoverflow.com/questions/47048492
复制相似问题