簡體   English   中英

C指針和類型轉換

[英]C pointer and type conversion

在C中使用字符串指針進行類型轉換需要一些幫助。我有一個函數從主循環獲取*argv以將命令行參數傳遞給它。 由於參數是固定的,我試圖給它自己的*argv樣式參數,但gcc everytime給出一個警告:

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

編程正在運行,但我很擔心。

DirectFB的網站可能包含有用的信息。

你的代碼應該是:

int main(int argc, char **argv)
{
    ...
    char  *argvxData[] = { "self", "--dfb:no-vt", 0 };
    char **argvx       = argvxData;
    int    argcx       = 2;

    DFBCHECK(DirectFBInit(&argcx, &argvx));
    ...
}

注意添加的空指針匹配main()程序中argv[argc]的空指針。 我沒有閱讀手冊以確保這是必需的,但一致性很好。 當我檢查我的答案的第一版時,它沒有在沒有警告的情況下編譯 - 事實上,它得到了你的警告; 我用argvxData數組和argvx雙指針修復了這個argvxData 原型中的[]主要是紅鯡魚,但避免被指責為三星級程序員 它相當於char ***argv

或者你可以將參數傳遞給main:

    DFBCHECK(DirectFBInit(&argc, &argv));

如果我們調用char * “string”,那么這會簡化它。 該函數需要一個指向字符串數組的指針。 您正在傳入一個字符串,並且該字符串的初始化不正確( argx類型為char*[]但您將其分配給char*類型的變量)。

&argxPtr實際上應該是&argx (函數所期望的char*(*[])類型的表達式),並且根本不需要argxPtr

像這樣的東西?

int myargc = 2;
const char *myargv[] = { "self", "--dfb:no-vt" };
DirectFBInit(&myargc, &myargv);

一種簡單的驗證方法是使用-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 **)

因此警告。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM