gpt4 book ai didi

c - 从二维数组参数运行 execvp

转载 作者:太空宇宙 更新时间:2023-11-04 06:26:02 26 4
gpt4 key购买 nike

我正在尝试使用来自 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;
}

最佳答案

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]< 的指针 并且没有任何序列的强制转换、索引、地址和取消引用会将一个转换为另一个。

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

char* arguments[30];

指向 char 的指针的动态大小数组是这样构成的:

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

如果你想调用 execvp,你需要使用其中之一。

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

关于c - 从二维数组参数运行 execvp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com