激論中の文字列リテラル

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
usao
記事: 1550
登録日時: 6年前

Re: 激論中の文字列リテラル

#31

投稿記事 by usao » 6年前

ところで,ほとんど関係ない話なのですけど

コード:

char str[] = "Hello!!";
char *str = "Hello!!";
の2つの書き方に関してですが,実用上,
上側と下側とで,メリット/デメリット とか(使い分け というか)あったりするのでしょうか?
(何か私は上側でしか書いたことが無いような…?)
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 激論中の文字列リテラル

#32

投稿記事 by ISLe » 6年前

コード:

char str[] = "Hello!!";
1. 文字列を格納するのに十分なchar型の要素を持つ配列の記憶域が確保されます。
2. 文字列リテラルが1.で確保された記憶域にコピーされます。
メリットは、文字列を書き換えることができること
デメリットは、文字列リテラルと重複する記憶域を確保することと文字列リテラルのコピーが発生すること
です。

コード:

char *str = "Hello!!";
1. charへのポインタ(アドレス)を格納する記憶域が確保されます。
2. 文字列リテラルの先頭要素を指すポインタ(アドレス)が1.で確保された記憶域にコピーされます。
メリットは、使用する記憶域が少ないこと
デメリットは、文字列を書き換えられない(正確には未定義の動作)こと
です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 激論中の文字列リテラル

#33

投稿記事 by softya(ソフト屋) » 6年前

ISLe さんに追加して書き加えるとしたら、char str[] = "Hello!!";は文字列コピーで、char *str = "Hello!!";はポインタ代入なので、ローカル変数に有った場合関数呼び出し毎に動作するので、深いループに有った場合速度差が累積する可能性がありますね。ISLe さんが暗に書いてますが念押しで書いときます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 激論中の文字列リテラル

#34

投稿記事 by ISLe » 6年前

特に組み込み系だと初期値のコピーが量産されてヒープやスタックをあっという間に食い潰してしまうので使い分けがとても重要です。

アバター
usao
記事: 1550
登録日時: 6年前

Re: 激論中の文字列リテラル

#35

投稿記事 by usao » 6年前

なるほど,確かに上側だと文字列コピーが発生する点を問題視するときに 下側のメリットがありますね.
ありがとうございました.

コード:

const char * const str = "Hello!!";  //下側的な書き方を使う場合でもこう書かない場合,
const char *str = "Hello!!";  //変数str(のメモリ)まで使いまわす予定,ということか.
char *str = "Hello!!";  //なら,これだと,変数strを 変更可能な対象 を指すために使いまわす予定,か.

閉鎖

“C言語何でも質問掲示板” へ戻る