2016-11-19 72 views
-5

以下幾行有什麼問題?以下使用strcat_s會顯示「C4047:間接級別不同」

//Thanks to Mark 
#include <string.h> 
#include <stdio.h> 
int main(int argc, char* argv[]) 
{ 
char datfile[127]; 
if(argc < 2) return -1; 
strcpy_s(datfile, strlen(argv[1]), argv[1]); 
strcat_s(datfile, strlen(argv[1]) + 4, ".dat"); 
printf("%s\n",datfile);//the warning appears here (why?) 
return 0; 
} 

它顯示Warning C4047 'function': 'const char *' differs in levels of indirection from 'char'

我已經通過MSDN爲C4047提供的文檔了。它命名爲levels of indirection。我已經在網絡上與這個主題i.e. levels of indirection進行了一些討論,並且(作爲一個新手),我發現那些超出了我的雷達範圍。

如果有人指出上述代碼的問題,並提供術語level of indirection的簡單易懂的解釋,我會很高興。原始錯誤的

+1

錯誤報價。 – Mat

+3

另外,兩種情況下的第二個參數都應該是* destination *中的元素數,而不是源,例如127.請參閱https://msdn.microsoft.com/en-us /library/td1esda9.aspx。 –

+0

@Mat'''謝謝。現在它說'......與'char''的間接程度不同 – AAK

回答

1

可驗證例如:

#include <string.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    char datfile[127]; 
    if(argc < 2) 
     return -1; 
    strcpy_s(datfile, strlen(argv[1]), argv[1]); 
    strcat_s(datfile, strlen(argv[1]) + 4, '.dat'); 
    printf("%s\n",datfile); 
    return 0; 
} 

VS2015(CL/NOLOGO/W4 test.c的)的輸出:

test.c 
test.c(10): warning C4047: 'function': 'const char *' differs in levels of indirection from 'int' 
test.c(10): warning C4024: 'strcat_s': different types for formal and actual parameter 3 

「間接水平」 表示在指針級別不匹配。 int, int*, int**有不同的間接程度。

隨着@Mat建議此以下行改爲雙引號:

strcat_s(datfile, strlen(argv[1]) + 4, ".dat"); 

,沒有警告,但崩潰是由於不正確的參數使用編譯。 strcpy_sstrcat_s的第二個參數是目的地緩衝區的長度,而不是源字符串長度。由於strlen(arg[v])不包含nul終止符,所以strcpy_s將失敗,因爲它將嘗試複製比指示多一個字節。

正確使用第二個參數:

#include <string.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    char datfile[127]; 
    if(argc < 2) 
     return -1; 
    strcpy_s(datfile, sizeof datfile, argv[1]); 
    strcat_s(datfile, sizeof datfile, ".dat"); 
    printf("%s\n",datfile); 
    return 0; 
} 

輸出:

C:\>cl /nologo /W4 test.c 
test.c 

C:\>test abc 
abc.dat 
+0

什麼是'間接水平'? – AAK

+0

「間接級別」表示指針類型的差異。 int,int *,int **,int ***'都是不同級別的間接尋址。 –

+0

@AAK,請製作一個[MCVE](https://stackoverflow.com/help/mcve)並提出一個新問題。我不知道如何重現你的C4042結果。上面發佈的代碼不會產生這種情況。 –