const static int BUFF = 256;
char name[BUFF];
というローカル変数があった場合
初期化方法としては
①、char name[BUFF] = "";
②、memset( name, 0, sizeof( char ) * BUFF );
のどちらが正しい、安全なのでしょうか?
上記以外で適切な方法がある場合は教えて頂きたいです。
宜しくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
こんにちは。
C++での配列の望ましいクリア方法は、ttyp03さんが回答されているchar name[BUFF] = {};
と思います。
そして、memset()による初期化はC++では可能な場合は使わない方が好ましいです。
例えば、char型を拡張してクラスで対応したいような場合もありますが、その時memset()を使ってクラス・インスタンスの記憶領域を無理やり0で埋めるのは禁じ手です。ttyp03さんが書かれている方法ならデフォルト・コンストラクタが呼ばれるので安全です。
私もベターCとしてC++を使っている頃はバシバシmemset()でクリアしていたのですが、C++の型システムに慣れてくるとmemset()には軽い恐怖を感じます。
投稿2017/03/01 08:28
総合スコア23272
0
「どちらが正しいか」は「どのように初期化したいか」によりけり。
最初の一文字を'\0'にする だけでいいなら (1)でOK (2)だと冗長
すべての'\0'にする なら (1)はNG (2)はOK
「どちらが安全か」は「なにをもって安全とするか」によりけり。
投稿2017/03/01 07:46
編集2017/03/01 07:53総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
どちらも微妙に違います。
宣言と同時に初期化する場合は、こう書けます。
c
1char name[BUFF] = {};
memsetで初期化する場合は、間違ってはいませんが、sizeofに変数名そのものを書いた方が楽です。
c
1memset( name, 0, sizeof( name ) );
投稿2017/03/01 07:46
編集2017/03/01 07:47総合スコア17000
0
BUFFの使用目的によります。
文字列を書き込む前提のバッファであれば初期化はそもそも必要ありません。
memsetは色々な理由でオススメしませんね…
こちらの回答が参考になるかと。
大体の場合は最終的に文字列として参照するのが目的なので、先頭に\0
さえ入っていればいいです。
C
1char buff[BUFF] = {}; 2 3someOtherFunction(buff); 4 5printf("%s", buff);
投稿2017/03/01 07:53
編集2017/03/01 08:32総合スコア1593
0
似た質問がありましたので挙げておきます。
C言語での文字列の初期化はどうしていますか?
②、memset( name, 0, sizeof( char ) * BUFF );
将来name
がchar
以外に修正される可能性もありえるので、まだmemset( name, 0, sizeof(name));
の方がよいと思います。
私の場合は、とりあえずchar name[BUFF] = {0};
をよく使います。
投稿2017/03/01 07:53
総合スコア38339
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/01 09:19
2017/03/01 10:43
2017/03/04 04:09
2017/03/04 04:23
2017/03/04 07:02