mojavy.com

C言語の文字列初期化について

January 21, 2013 at 08:00 PM | categories: C, programming |

なんとなく気になったので以下ひとりごと。


Cで文字列を初期化するときは以下のように書く。

char str[] = "xyz";

こう書けばNULL終わりのchar配列としてスタックに格納してくれるので、以下のように書くのと同じことになる。

char str1[4] = "xyz";
char str2[4] = {'x', 'y', 'z', '\0'};

文字列はcharのポインタで扱うからといって、

char *str = "xyz";

のように書くと違う意味になる。 こう書くと"xyz"が格納されているアドレスでポインタを初期化する。文字列リテラルで宣言したデータが格納される領域は通常はread onlyなので*str='X'などとするとセグフォするが、通常の代入と同じ意味なので違和感はない。

でも、char str[] = "xyz"; のほうはは冷静に考えると気持ち悪い。初期化と代入は違うといってしまえばそれまでだけど、この式だけみても予備知識がないとなにがおこるのかわからないと思う。

以下のような挙動も合理的とは思えない。そもそもCに配列なんて必要なかったのではないか。

void f1(char s[]) {
    /* 意味はないけどエラーでもない */
    s = "baz";
}

void f2(void) {
    char s[] = "foo";
    /* これはエラー */
    /* s = "bar"; */
}

などということを今更ながら考えて悶々としていたのだけど、結局のところこういう類の便利機能は欲しくなってくるわけで、便利さのために不合理を許容するとなるとこのあたりが妥当な落とし所のような気もしてきた。

まとめ:プログラミング言語を考える人はすごい


blog comments powered by Disqus

About Me

pic
mojavy

Recent posts






Categories



Badges