文字列定数に気をつけろ!

独習Cの問題は余裕余裕と鼻くそほじりながら解いていたら,ある問題でひっかかる.
strcat()関数を自分で設計しなさいという問題.


文字列とポインタについて大分知識がついたつもりだったところで落とし穴.
あれ,うまくいかないよママン

  char *str1, *str2;
  char *q, *p;

  str1 = "hoge";
  str2 = "foo";

  q = str1;
  while(*p = '\0'){
    p++;
  }

  for(q = str2; *q != '\0'; q++){
    *p = *q;
    p++;
  }


すると謎のエラー

Bus error (core dumped)


しばらく考えてもわからない.printf()挿入法で調べていくと,
どうやら*p = *qの部分が悪さをしているということが判明.
ここはどうしても違和感が残るのだけれど,文法上は問題ない…はず.


そういえばこのときstr1が持っているのって,"hoge"という文字列定数テーブルに登録された文字列定数の先頭ポインタじゃない!
文字列定数って書き換えるの無理じゃね?ということにようやく気がつく


というわけで,あわてて配列に直す
ついでにwhileループでなくてforループにしてみた

  char str1[] = "hoge";
  char str2[] = "foo";

  char *p, *q;

  printf("%s\n", str1);
  printf("%s\n", str2);

  for(p = str1; *p != '\0'; p++);
  for(q = str2; *q != '\0'; q++){
    *p = *q;
    p++;
  }
  *p = '\0';


きっちり文字列の結合ができました
めでたしめでたし