すごく単純なもので申し訳ないのですが助けてください。
#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使ってます。
ポインタで文字列を扱う
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ポインタで文字列を扱う
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 );で後ろに無理やり追加するわけですからどうなるか環境に依存して動作は保証されません。
何処かのデータを破壊したりしている可能性が高いと言えます。
この場合は、char s[10] = "abc"; だと10文字分の配列が確保されて"abc"とナル文字が格納される事になります。のこり6文字分はも自分は使わずに残っているわけです。[誤字修正]
そこへstrcat( s , t ); で"def"が結合されてナル文字と合わせて7文字分を使いますが残り3文字は余るということです。
問題のあるchar *s = "abc"; はジャスト4文字分しか確保されていないのと"abc"が書き込めない領域に確保されている可能性があります。
それをstrcat( s , t );で後ろに無理やり追加するわけですからどうなるか環境に依存して動作は保証されません。
何処かのデータを破壊したりしている可能性が高いと言えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。