2017-10-28 94 views
0

我有一個問題。strcpy_s緩衝區L緩衝區太小&& 0

我試圖proceede以下步驟:

char * str; 
    char * s="Hello"; 
    int len = std::strlen(s); 
     str=new char[len +10]; 
    strcpy_s(str,sizeof(str) ,s); 

但PROGRAMM顯示錯誤,這是我在標題寫。

如果我用一個數字替換sizeof(str),例如256,彈出窗口出現,並且消息project.exe觸發了一個斷點。

我怎樣才能解決這個錯誤與strcpy_s? 謝謝!

+0

當標準庫函數沒有達到您的期望值時,請查看您調用它們的參數。打印值爲'sizeof(str)'的值。 –

回答

0

sizeof(str)給出char*的大小,即而不是分配數組的長度。要解決這個問題,你必須給出分配的長度。在這種情況下,這將是

strcpy_s(str, len + 10, s); 
+0

你能解釋一下,爲什麼我要寫len + 10?我以爲我必須只做len + 1,因爲最終的'\ 0'? – Perilun

+0

因爲第二個參數應該是目標緩衝區的大小。有關更多詳細信息,請參見http://en.cppreference.com/w/c/string/byte/strcpy。 –

+0

在示例中,源代碼中,我看到以下代碼部分: char dst [strlen(src)+ 1]; // +1來容納空終止符,那麼爲什麼我必須使len + 10而不是len +1?並且我有總會讓len + 10?我會非常感謝你的指導! – Perilun

0

取決於實現的sizeof(str)回報char*其尺寸是(可能)或者48或(字節)。在你的情況下,它似乎是4這是不足以容納構成"Hello"文字加上空終止字符的字符。由於沒有足夠的空間,strcpy_s函數調用undefined behavior。您至少需要6字節,這是空字符的字符數+ 1字節。而不是str=new char[len + 10];你可能意思是str = new char[len + 1];以適應\0角色。因此,你的代碼應該是:

#include <iostream> 

int main(){ 
    char* str; 
    char* s = "Hello"; 
    int len = std::strlen(s); 
    str = new char[len + 1]; 
    strcpy_s(str, len + 1, s); 
} 

這就是說比較喜歡std::string C樣式的字符數組。