0

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

2 回答 2

2

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

为了解决这个问题,定义你的结构

struct userinput {
    char *anyargs[30]; //space for 30 char* pointers
};

你也可以定义anyargschar**如果动态使用,(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;

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

于 2014-11-09T17:34:06.137 回答
2

char[][]在 C中没有这样的东西。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*指针,而是指针tochar[30]并且没有任何类型的强制转换、索引、地址和取消引用将一个转为另一个。

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

char* arguments[30];

一个动态大小的指针数组char是这样制作的:

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

如果你想打电话,你需要使用其中之一execvp

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

于 2014-11-09T17:52:35.500 回答