ポインタで文字列を扱う

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ohyohyo

ポインタで文字列を扱う

#1

投稿記事 by ohyohyo » 14年前

すごく単純なもので申し訳ないのですが助けてください。

#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: ポインタで文字列を扱う

#2

投稿記事 by softya(ソフト屋) » 14年前

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 );で後ろに無理やり追加するわけですからどうなるか環境に依存して動作は保証されません。
何処かのデータを破壊したりしている可能性が高いと言えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ohyohyo

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

#3

投稿記事 by ohyohyo » 14年前

codeタグ気づきませんでした、すみません。
迅速な解答ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る