char* と char[] の違い

日経ソフトウェアの2013年2月号に書かれていた記事で、C++ (あるいはC言語) のchar*とchar[]の違いについて触れてありました。普段はstd::stringしか使わないので、こんな違いがあるとは思わなかった。次のコードを見てください。


#include <stdlib.h>

int main() {
    char* var = "this is charactors";
    var[0] = 'T';
    printf("%sn", var);
}

一見正しそうに見えるし、実際コンパイルは通る (なんと!!) 。だけど6行目で実行時エラーが起こります。なんでもchar*に渡される文字列リテラルは変更禁止領域に確保されているらしく、書き換えができないらしいのです。正しくは、次のようなコードを書かなくてはなりません。


#include <stdlib.h>

int main() {
    char var[] = "this is charactors";
    var[0] = 'T';
    printf("%sn", var);
}

このコードなら正しく実行が可能です。ちなみに当然ながらstd::stringを用いた実装でも同じことはできます。


#include <string>

int main() {
    std::string var = "this is charactors";
    var[0] = 'T';
    std::cout << var << std::endl;
}

C++ばかり書いていると気づかない機能ですが、これは勉強になりました。