首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Execvp内存错误

Execvp内存错误
EN

Stack Overflow用户
提问于 2017-11-01 04:58:13
回答 1查看 176关注 0票数 0

因此,我有一个c程序,它接受命令的输入,但偶尔,我似乎会收到某种内存错误。

我如何阅读输入:

代码语言:javascript
复制
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差伦,我得到了以下内容(在执行中):

代码语言:javascript
复制
Invalid read of size 1

我呼叫的命令是

代码语言:javascript
复制
cat aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test

但是,当我的程序失败时,它会打印出:

代码语言:javascript
复制
cat: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaD: No such file or directory

这似乎被改写了。谁能解释一下原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-01 05:45:49

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

代码语言:javascript
复制
   char copyLine[MAX_LENGTH];
   ...
   strcpy(copyLine, commandLine);

   token = strtok(copyLine, DELIM);

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

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

您正在makeSequence中复制一个副本,但是您复制的是指针数组,而不是指针所指向的字符串!

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47048492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档