在C语言中使用字符串指针进行类型转换需要一些帮助。我有一个函数从主循环获取*argv
以将命令行参数传递给它。由于参数是固定的,我试图给它自己的*argv
样式参数,但gcc每次都会发出警告:
passing argument 2 of ‘DirectFBInit’ from incompatible pointer type
代码:
int main (int argc, char *argv[])
{
...
char *argx[2] = {"self","--dfb:no-vt"};
char *argxPtr = argx;
DFBCHECK (DirectFBInit (&fakeArgc, &argxPtr));
...
}
我应该提到函数是操作argv(因此是argx)。
以下是DirectFBInit
:
DFBResult DirectFBInit(
int *argc, /* pointer to main()'s argc */
char *(*argv[]) /* pointer to main()'s argv */
);
编程正在运行,但我很担心。
答案 0 :(得分:3)
DirectFB的网站可能提供了有用的信息。
您的代码应该是:
int main(int argc, char **argv)
{
...
char *argvxData[] = { "self", "--dfb:no-vt", 0 };
char **argvx = argvxData;
int argcx = 2;
DFBCHECK(DirectFBInit(&argcx, &argvx));
...
}
注意添加的空指针匹配argv[argc]
程序中main()
的空指针。我没有阅读手册以确保这是必需的,但一致性很好。当我检查我的答案的第一版时,它没有在没有警告的情况下编译 - 事实上,它得到了你的警告;我用argvxData
数组和argvx
双指针修复了这个问题。原型中的[]
主要是红鲱鱼,但避免被指责为three-star programmer。它相当于char ***argv
。
或者您可以将参数传递给main:
DFBCHECK(DirectFBInit(&argc, &argv));
答案 1 :(得分:1)
如果我们调用char *
“string”,那么这会简化它。该函数需要一个指向字符串数组的指针。您传入一个字符串,并且该字符串的初始化不正确(argx
的类型为char*[]
,但您将其分配给char*
类型的变量。
&argxPtr
实际应该是&argx
(函数所期望的char*(*[])
类型的表达式),并且您根本不需要argxPtr
。
答案 2 :(得分:0)
这样的东西?
int myargc = 2;
const char *myargv[] = { "self", "--dfb:no-vt" };
DirectFBInit(&myargc, &myargv);
答案 3 :(得分:0)
一种简单的验证方法是使用-g进行编译并运行gdb。进入gdb后,运行程序,然后键入ptype,您将看到差异。我用foo()
替换了func名称foo(int *argc, char *(*argv[]))
{
}
int
main (int argc, char *argv[])
{
char *argx[2] = {"self","--dfb:no-vt"};
char *argxPtr = argx;
foo (&argc, &argxPtr);
}
(gdb) ptype foo
type = int (int *, char ***)
(gdb) ptype main
type = int (int, char **)
因此警告。希望这会有所帮助。