所以我遇到了一个我无法解决的问题。 我正在编写一个C程序,通过管道执行一些OS功能。执行是用execvp(const char * file,char * const argv []);.
完成的。在我的main函数中,我想将整行传递给程序(argv),除了第一个char-array并将其传递给grep。此刻一切正常,但我一直收到警告:
warning: initialization from incompatible pointer type [enabled by default]
const char* grep = argv;
^
我的代码如下所示。在if(1 < argc)
条款中,我希望能够将argv
的第一个帖子修改为newPipeline
,格式与printenv,sort和less相同。
int main(int argc, char** argv, char **envp){
const char* printenv[] = {"printenv", NULL, NULL};
const char* sort[] = {"sort", NULL, NULL};
const char* less[] = {"less", NULL, NULL};
if(1<argc){
argv[0] = "grep";
const char* grep = argv;
const char* const* commands[] = {printenv, sort, grep, less, NULL};
newPipeline((char* const**)commands, 0, STDIN_FILENO);
}
//FROM HERE ON IT WORKS
else{
const char* const* commands[] = {printenv, sort, less, NULL};
newPipeline((char* const**)commands, 0, STDIN_FILENO);
}
if(signal(SIGCHLD, SIG_IGN) == SIG_ERR){
perror("A problem with the children");
}
exit(0);
}
我知道指针类型错误。我应该为grep
建立一个全新的数组,还是应该像我现在所做的那样,将指针指向正确的指针。如果以后,哪个指针会是什么?
答案 0 :(得分:2)
你的grep变量需要是一个指向字符串数组或字符串数组的指针(不仅仅是一个字符串)。
类似的东西:
argv[0] = "grep";
const char** grep = (const char**)argv; //make grep point to the modified char** argv;
应该这样做,或构建一个新数组:
const char* grep[argc+1];
grep[0] = "grep";
grep[argc]=NULL;
for(int i=1; i<argc; i++){
grep[i] = argv[i];
}
BTW,我相信在每个字符串数组的末尾只需要一个NULL
。
答案 1 :(得分:1)
问题出在这里
const char* grep = argv;
C不为const类型提供内部类型转换。如果你的动机是将argv
的数组复制到grep
,那就错了,使用strcpy
或任何此类函数来复制该数组。