ページ 11

ポインタで文字列を扱う

Posted: 2012年6月18日(月) 23:19
by ohyohyo
すごく単純なもので申し訳ないのですが助けてください。

#include <stdio.h>
#include <string.h>

int main(void)
{
char *s = "abc";
char *t = "def";
// char s[10] = "abc";
// char t[10] = "def";

strcat( s , t );

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

return 0;
}

**.exeは動作を停止しました と出て実行できません。
コメントアウト部分を変えてポインタを配列にすると普通に実行されます。
たったこれだけなのに何が間違ってるのかわかりません…
ちなみにvisual c++2008使ってます。

Re: ポインタで文字列を扱う

Posted: 2012年6月18日(月) 23:33
by softya(ソフト屋)
codeタグをお使い下さいね。 http://dixq.net/board/board.html

この場合は、char s[10] = "abc"; だと10文字分の配列が確保されて"abc"とナル文字が格納される事になります。のこり6文字分はも自分は使わずに残っているわけです。[誤字修正]
そこへstrcat( s , t ); で"def"が結合されてナル文字と合わせて7文字分を使いますが残り3文字は余るということです。

問題のあるchar *s = "abc"; はジャスト4文字分しか確保されていないのと"abc"が書き込めない領域に確保されている可能性があります。
それをstrcat( s , t );で後ろに無理やり追加するわけですからどうなるか環境に依存して動作は保証されません。
何処かのデータを破壊したりしている可能性が高いと言えます。

Re: ポインタで文字列を扱う

Posted: 2012年6月19日(火) 00:18
by ohyohyo
codeタグ気づきませんでした、すみません。
迅速な解答ありがとうございます。