从2D数组参数运行execvp

从2D数组参数运行execvp,c,arrays,pointers,execvp,execv,C,Arrays,Pointers,Execvp,Execv,我试图使用char[][]类型(也称为字符串数组)中的数据运行execvp。现在我知道了execvp()将指向字符串的指针作为其第一个参数,然后将指向字符串数组的指针作为其第二个参数-事实上,我以前也曾成功地使用过它-但是我似乎无法获得正确的指针和字符串组合,以使其在下面运行-无论我尝试什么都被视为不兼容 任何帮助都非常感谢:)-我已经删除了我的标题来压缩代码 struct userinput { char anyargs[30][30]; //The tokenised command

我试图使用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;
}
第二个参数应为
char*const argv[]
。这意味着指向char的指针数组。这与
字符[30][30]
不同,后者在内存中表示为30x30个连续字符(因此没有指针)

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

struct userinput {
    char *anyargs[30]; //space for 30 char* pointers
};
您还可以将
anyargs
定义为
char**
,并使用
(char**)calloc(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;
编辑:警告:“指针数组必须以空指针终止。

第二个参数应为
char*const argv[]
。这意味着指向char的指针数组。这与
字符[30][30]
不同,后者在内存中表示为30x30个连续字符(因此没有指针)

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

struct userinput {
    char *anyargs[30]; //space for 30 char* pointers
};
您还可以将
anyargs
定义为
char**
,并使用
(char**)calloc(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;

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

在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[30]
的指针初始化指向
char*
数组的指针,即使声明指向
char*
数组的指针,也不可能正确,因为赋值的右侧不是指向
char*
数组的指针,而是指向
char[30]的指针
而且,强制转换、索引、地址和取消引用的顺序不会相互转换

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

char* arguments[30];
char** arguments = calloc (nargs, sizeof(char*));
指向
char
的指针的动态大小数组如下所示:

char* arguments[30];
char** arguments = calloc (nargs, sizeof(char*));
如果要调用
execvp
,则需要使用其中一个


在任何一种情况下,指针数组中的每个指针都必须初始化为指向单个以NUL结尾的字符数组(可能指向
char[30][30]
数组的元素),最后一个指针(我们要传递的所有参数之后的一个)必须设置为NULL。(我想知道你怎么能在
char[30][30]
中找到空值。)

在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[30]
的指针初始化指向
char*
数组的指针,即使声明指向
char*
数组的指针,也不可能正确,因为赋值的右侧不是指向
char*
数组的指针,而是指向
char[30]的指针
而且,强制转换、索引、地址和取消引用的顺序不会相互转换

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

char* arguments[30];
char** arguments = calloc (nargs, sizeof(char*));
指向
char
的指针的动态大小数组如下所示:

char* arguments[30];
char** arguments = calloc (nargs, sizeof(char*));
如果要调用
execvp
,则需要使用其中一个


在任何一种情况下,指针数组中的每个指针都必须初始化为指向单个以NUL结尾的字符数组(可能指向
char[30][30]
数组的元素),最后一个指针(我们要传递的所有参数之后的一个)必须设置为NULL。(我想知道您是如何期望在
char[30][30]
中找到空值的。)

您是否尝试过
arrPointer=(inPtr->anyargs)
不带&?是-如果我错了,请更正->运算符取消引用并返回值-我们不希望作为arrpoint和execvp直接获取值-它们获取指向值的指针?您尝试过
arrPointer=(inPtr->anyargs)吗
不带&?是-如果我错了请更正->运算符取消引用并返回值-我们不希望将其作为arrpoint和execvp直接获取值-它们获取指向值的指针?