C指针和类型转换

时间:2013-07-12 23:31:07

标签: c pointers casting

在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 */
                  );

编程正在运行,但我很担心。

4 个答案:

答案 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 **)

因此警告。希望这会有所帮助。