我正在尝试使用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;
}
答案 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。)