對於新手,某些可變參數函數在使用時,可能會出現的問題

在學習進程操作測試linux exec函數時,寫了非常簡單的一段測試代碼,如下:wKioL1fzYAyBbMJbAAAtd1678Rc582.png

在用gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 編譯時,提示一下問題:
wKioL1fzYKyw6cBXAAAiGbnUgXM523.png

後來,與一本參考書進行比對,也沒有發現錯誤(可能GCC版本不一樣),後來查找了一下其它資料,發現問題:對於一些參數爲變長數組的函數,必須在參數末尾加上 NULL 值,來表明傳遞的參數結束.例如這裏的execl格式(exec的一種形式,其總共有六種表達形式).

   對於有可變參數數組的函數,可能出現的一些問題闡述一下.以execl形式爲例.

這個函數:execl(const char * path, const char * arg0, .../* (char*)0 */);

在用GCC進行編譯時,可能會出現以下兩種問題:
1   warning: not enough variable arguments to fit a sentinel(參數個數不足);

     解決方法:補齊參數即可.對於上面的execl函數,至少需要兩個參數.(path 可執行文件的文件名,即完整 路徑;arg 作爲約定,與path一樣指出目標文件的路徑);

2   warning: missing sentinel in function call;

      解決方法:在形參列表中,添加一個NULL 或者採用(char*)0也可以,給編譯器(complier)一些提示:"告訴編譯器,不要往下找了,沒有參數需要傳遞了".

         如execl("/bin/date","/bin/date",(char*)0)與execl("/bin/date","/bin/date",NULL);


wKiom1fzZzfQsY4YAAA7UgdfzeU181.png

此外,對於0與(char*)0 ,在64位的操作系統中,整數0是32位,而指針0是64位的,但是,編譯器(complier)並不能知道,所以纔會出現問題.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章