我无法获得执行args的execvp,只有当我将args的数量设置为0时,此代码才有效。我一直在尝试在这里和那里更换行2小时并检查其他类似的问题,但没有什么是工作,也许有人有个主意?
void executeProgram()
{
char *argv[20];
printf("Please enter command or program name:");
char *commande;
scanf("%s", commande);
argv[0] = malloc(100);
argv[0] = commande;
int nbArgZ = -1;
while(nbArgZ < 0){
printf("Please enter number of arguments:");
scanf("%d", &nbArgZ);
}
int x;
int y =1;
for(x = 1; x < nbArgZ+1; x++){
char *tempo;
argv[x] = malloc(100);
printf("Argument %d : ", x);
scanf("%s", tempo);
argv[x] = tempo;
y++;
}
argv[y] = NULL;
int pid = fork();
if ( pid == 0 ) {
execvp(argv[0], argv);
}
wait(2);
printf( "End of execution\n");
}
答案 0 :(得分:2)
您有多个问题。以下是其中几个:
argv[x] = malloc(100);
...
argv[x] = tempo;
首先,让argv[x]
指向您分配的内存,然后将argv[x]
指向tempo
所指向的位置,使您丢失原始内存。
关于tempo
:
char *tempo;
...
scanf("%s", tempo);
你有一个未初始化的指针。指向的地方是不确定并且看起来几乎是随机的。取消引用此指针(当您调用scanf
时会发生这种情况)会导致未定义的行为。
将argv[x]
直接传递到您的scanf
电话可以解决这两个问题:
scanf("%99s", argv[x]); // No more than 99 characters (excluding terminator)
你有同样的问题不是一次,但两次。
答案 1 :(得分:1)
此代码
argv[0] = malloc(100);
argv[0] = commande;
应立即引爆警钟。你分配东西tog argv [0],然后在下一行中将它设置为其他东西。那不可能是正确的
你需要
char commande[100]; // we will assume 100 is enough
scanf("%s", commande);
argv[0] = strdup(commande); // strdup maybe not needed, buts lets be safe
和arg循环中的相同更改