从2D数组参数运行execvp

时间:2014-11-09 17:03:59

标签: c arrays pointers execvp execv

我正在尝试使用char [] []类型(也就是字符串数组)中的数据来运行execvp。现在我知道 execvp() 将一个指向字符串的指针作为它的第一个参数,然后指向一个字符串数组的指针作为它的第二个 - 事实上我甚至已经成功地使用它 - 但是我似乎无法得到它正确的指针组合&字符串让它在下面解决 - 无论我尝试什么都被认为是不兼容的!

任何帮助都非常感激:) - 我删除了我的标题以压缩代码!

struct userinput {
    char anyargs[30][30]; //The tokenised command
};

int main() {

    struct userinput input = { { { 0 } } }; //I believe is valid to set input to 0's
    struct userinput *inPtr = &input; //Pointer to input (direct access will be unavailable)

    strcpy(inPtr->anyargs[0], "ls"); //Hard code anyargs to arbitary values
    strcpy(inPtr->anyargs[1], "-lh");

    char (*arrPointer)[30]; //Pointer to an array of char *
    arrPointer = &(inPtr->anyargs[0]);

    printf("arrPointer[0]: %s, arrPointer[1]: %s\n", arrPointer[0],
            arrPointer[1]);

    printf("At exec case; ");
    execvp( arrPointer[0], arrPointer);
    perror("Command not recognised"); //Prints string then error message from errno

    return 0;
}

2 个答案:

答案 0 :(得分:2)

execvp()期望第二个参数为char *const argv[]。这意味着指向char的指针数组。这与char[30][30]不同,struct userinput { char *anyargs[30]; //space for 30 char* pointers }; 在内存中表示为30x30连续字符(因此没有指针)。

要解决此问题,请定义您的结构

anyargs

您也可以将char**定义为(char**)calloc(number_of_args+1,sizeof(char*)),并在动态inPtr->anyargs[0] = "ls"; //Hard code (or use strdup() ) inPtr->anyargs[1] = "-lh"; inPtr->anyargs[2] = NULL; // end of the argument list !!! char **arrPointer; //Pointer to an array of char * arrPointer = inPtr->anyargs;

时进行初始化

稍后,直接指定指针:

{{1}}

编辑:警告:“ 指针数组必须以NULL指针终止。 ”。

答案 1 :(得分:2)

C中没有char[][]这样的东西。execvp需要一个指向const char的指针数组。这可以写成char * const *char * const []

但是你有一个30个字符长的数组数组,而不是一个指针数组。这两种类型不兼容,不可互换,不能在任何一个方向上相互转换。

在这一行

char (*arrPointer)[30]; //Pointer to an array of char *

您尝试错误地声明指向char *数组的指针。你声明的是指向char[30]的指针,这与execvp期望的指针非常不同。

下一行

arrPointer = &(inPtr->anyargs[0]);

声称使用指向char*的指针初始化指向char[30]数组的指针,即使您声明指向char*数组的指针,该指针也可能无法正确,因为赋值的右侧不是指向char*数组的指针,它是指向char[30]的指针,并且没有强制转换,索引,地址和解引用的序列将转向另一个。

指向char的30个指针的数组声明如下:

char* arguments[30];

动态调整大小的char指针数组如下:

char** arguments = calloc (nargs, sizeof(char*));

如果您想拨打execvp,则需要使用其中一个。

在任何一种情况下,指针数组中的每个指针都必须初始化为指向单个NUL终止的字符数组(可能指向char[30][30]数组的元素)和最后一个指针(一个在所有争论者之后)想要传递)必须设置为NULL。 (我想知道你期望在char[30][30]中找到一个NULL。)