2012-03-08 9 views
0

Cで文字列を動的に割り当てるとき、文字列charの\ 0の末尾を数えますか?文字列のためにCでメモリを動的に割り当てるとき、文字列charの 0終わりを数えますか?

char *copyInto, *copyFrom="test"; 

// Should 
copyInto = (char*)malloc(strlen(copyFrom)); 
// suffice? 

// or should this be the following? 
copyInto = (char*)malloc(strlen(copyFrom)+1); 

// assuming you want to copy the string from copyFrom into copyInto 
strcpy(copyInto,copyFrom); 

// Does anyone recommend just \0-ing the whole copyInto as in 
copyInto = (char*)calloc(strlen(copyFrom)+1); 
// and if so, should it still be (strlen(copyFrom)+1) size? 
+4

あなたはそのヌルターミネーターを保管する予定ですか? –

+0

私はボディではなくタイトルを読みました。答えははいです。長さに1文字を加えて割り当てます。 – asveikau

+0

@ K-balloもし私がそのヌルターミネータを保存していないのであれば、C stdlibの文字列処理関数は文字列の終了位置を知らないでしょうか?最後の有効な文字位置に続くメモリバイトが\ 0に設定されていない場合、Cの文字列プロセッサは最初の\ 0まで継続します。最後の文字の後に続くバイトが\ 0であることを保証することはできません。 –

答えて

6
  1. Cプログラムで、(そのことについてまたはrealloc()malloc()またはcalloc()の戻り値をキャストしないでください。
  2. はい、+1が必要です。
  3. calloc()を使用して、文字列全体をゼロにしてすぐにコピーする場合は、どうしたらいいですか?私にサイクルの浪費のようです。
+0

再:#1では、代わりに '#include 'のようなものを追加して、コンパイラがそれらの迷惑な警告を投げないようにします。 – Perry

+0

私はcalloc()について同意します。私はWindowsのBorland C++ Builderアプリケーション全体をcallocからmallocに変換しました。これは余分な処理と時間を大幅に削減しました。また、共通のlibファイルをあらかじめコンパイルしたヘッダーに入れておくと、コンパイル時間が大幅に短縮されました。私はプリコンパイルされたヘッダーファイルに#include を追加して、明示的な(char *)キャストを取り消したとき、 "[C++ Error] formName.cpp(770)エラーが出ました:E2034 'void *'を 'char *'に変換できません" –

+0

malloc()ポインタへの明示的な(char *)キャストがないと、Cでの警告だけが出力されますが、C++でのエラーは出力されますか? –

関連する問題