2010-06-08 39 views
0

我试图做一些很简单:填补字符**与论据我想在execvp呼叫C.字符** nargv是空的,但不知道为什么

使用这是怎么了这样做的:

if(argc >=1) 
    { 
     *nargv = "--action"; 
     while(argc--) 
     { 
      printf("nargv1 => %s \t argv1 => %s \n", *nargv, *argv); 
      *++nargv = *argv++; 
      printf("nargv2 => %s \t argv2 => %s \n", *nargv, *argv); 
     } 

     printf("nargv3 => %s \t argv3 => %s \n", *nargv, *argv); 
     *nargv++ = '\0'; 
     printf("nargv4 => %s \t argv4 => %s \n", *nargv, *argv); 
} 

输出给我:

nargv1 => --action  argv1 => backup 
nargv2 => backup   argv2 => --help 
nargv1 => backup   argv1 => --help 
nargv2 => --help   argv2 => (null) 
nargv3 => --help   argv3 => (null) 
nargv4 => (null)   argv4 => (null) 

这听起来不错(nargv填写正确,至少这是我认为)>但是当我做execvp( “命令”,nargv)我的论点没有通过。怎么了 ?我试图与gdb一起玩,但没有成功。

问候

回答

5

既然你做++nargv,你nargv指针最终指向过去的数组的末尾。保留一个指向初始成员的指针并将其传递给exec。此外,*nargv++ = '\0'看起来像一个错误,因为您将一个字符分配给指向char的指针。

+0

'\ 0'的好处。我会解决这个问题。 对于你的答案的其他部分,你能告诉我一些代码来做到这一点吗?我没有得到它:p thanx – 2010-06-08 15:20:00

+2

它的'像这样 - 如果你以p = top和loop p ++开始,那么在循环结束时p将指向列表的* end *,而不是开始。你需要通过开始,即顶部不是p。 – eemz 2010-06-08 15:36:52

+1

或者,使用数组索引:如果你做* nargv ++,你修改nargv,但是如果你做nargv [i ++],你只修改索引i并且可以将完整的nargv传递给exec。 – 2010-06-08 18:18:24