2017-10-28 9 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); 

をしかし、プログラムの開発は、私がタイトルで書いた、エラーが表示されます。

sizeof(str)を数字(たとえば256)に置き換えると、project.exeがブレークポイントをトリガしたというメッセージとともにポップアップウィンドウが表示されます。

どうすればこのエラーをstrcpy_sで解決できますか? ありがとうございました!

+0

標準ライブラリ関数が期待したことをしないときは、呼び出した引数を見てください。値os 'sizeof(str)'を表示します。 –

答えて

0

sizeof(str)のサイズは、ではなく、であり、割り当てられた配列の長さはchar*です。これを修正するには、割り当てられた長さを指定する必要があります。この場合には、これは

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

len + 10と書かなければならない理由を説明してください。私は最後に '\ 0'のためにlen + 1だけを作らなければならないと思った? – Perilun

+0

2番目の引数は宛先バッファのサイズである必要があるためです。詳細はhttp://en.cppreference.com/w/c/string/byte/strcpyを参照してください。 –

+0

ソースにある例では、次のコード部分が表示されます。 char dst [strlen(src)+ 1]; //ヌルターミネータに対応するために+1して、なぜlen +1の代わりにlen +10を作らなければならないのですか?そして、私はいつもlen + 10を作るために持っていますか?私は指示に非常に感謝しています! – Perilun

0

sizeof(str)なり、実装に応じて(おそらく)4又は8(バイト)のいずれかであるchar*のサイズを返します。あなたの場合は4と表示され、"Hello"リテラルとヌル終端文字を構成する文字を保持するには不十分です。十分なスペースがないので、strcpy_s関数はundefined behaviorを呼び出します。少なくとも6バイト(ヌル文字の場合は文字数+ 1バイト)が必要です。また、str=new char[len + 10];の代わりに、文字に対応するには、おそらくstr = new char[len + 1];を意味します。したがって、あなたのコードは次のようになります。

#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); 
} 

言われていることCスタイルの文字列にstd::stringを好みます。

関連する問題