C言語関係掲示板

過去ログ

No.242.strcat関数 配列aをはみ出して配列bが連結


No.1463

strcat関数について
投稿者---KANI(2002/05/01 02:55:03)


strcat関数について不思議に思うことがあります。例えば、
 a[3]="ab";
 b[3]="cd";
 strcat(a,b);
とすると、配列aをはみ出して配列bが連結され、この状態で配列aをprintfなどで出力すると、
 abcd
とちゃんと連結されて出力されます。これは正常な処理なのでしょうか?

No.1464

文字列の十分な大きさ
投稿者---ともじ(2002/05/01 09:03:11)


こんにちは。

>strcat関数について不思議に思うことがあります。例えば、
> a[3]="ab";
> b[3]="cd";
> strcat(a,b);
>とすると、配列aをはみ出して配列bが連結され、この状態で配列aをprintfなどで出力すると、
> abcd
>とちゃんと連結されて出力されます。これは正常な処理なのでしょうか?

いえ、異常な処理です。
C言語というプログラム言語は、「プログラマはミスを犯さない」
と言う前提で作られた言語で、エリアの確保や解放などは仮にプログラマが
きちんと行っていなくてもエラーも警告も出してくれません。
ですから、上記の場合、たまたまうまく出力されているだけで、エリア破壊
が起きていますので、運が悪いとプログラムが暴走します。
ですから、特に文字列を扱う場合にはエリアは十分な大きさを確保して
ください。

ところで、この十分な大きさですが、
・画面の1行は80カラムなので最低80バイト
・キリよく100バイト
・2の7乗で128バイト
・2の8乗で256バイト
などいろいろ言われていますが、どの辺が妥当なのでしょうか。
みなさんのご意見をお聞かせください。


No.1465

Re:
投稿者---KANI(2002/05/02 05:21:11)


なるほど。たまたまうまく動いただけなんですね〜。
どうもありがとうございました。

No.1466

Re:文字列の十分な大きさ
投稿者---とおりすがりのななし(2002/05/02 14:22:48)


>ところで、この十分な大きさですが、
>・画面の1行は80カラムなので最低80バイト
>・キリよく100バイト
>・2の7乗で128バイト
>・2の8乗で256バイト
>などいろいろ言われていますが、どの辺が妥当なのでしょうか。
>みなさんのご意見をお聞かせください。

動的に確保する(メモリリークに注意)か、
strncpyのようにサイズ上限付で処理するしかないと思います。
strncpyなどでの「十分な大きさ」は、
BUFSIZなどのシステムで与えている数にするか、
2kBとかの大きなサイズを使うのがいいでしょう。
メモリが捨てるほどある時代ですからね...

No.1474

Re:文字列の十分な大きさ
投稿者---ともじ(2002/05/06 17:16:49)


返信ありがとうございました。連休中で返信が遅くなりました。

>動的に確保する(メモリリークに注意)か、
>strncpyのようにサイズ上限付で処理するしかないと思います。
>strncpyなどでの「十分な大きさ」は、
>BUFSIZなどのシステムで与えている数にするか、
>2kBとかの大きなサイズを使うのがいいでしょう。
>メモリが捨てるほどある時代ですからね...

そうですね。メモリサイズを気にする時代でもないので、
BUFSIZを使うのがいいですね。
今後そのようにしていきたいと思います。

No.1503

Re:文字列の十分な大きさ
投稿者---とおりすがりのななし(2002/05/14 12:53:44)


>そうですね。メモリサイズを気にする時代でもないので、
>BUFSIZを使うのがいいですね。

というか、一番重要なのはメモリサイズではなく、
バッファオーバーランをしないようにすることです。
用意してある領域を越えた文字列の書き込みをしないようにするために、
strcatは使わない、必ずstrncatをつかう、というようにするのが
大切ではないかと思います。

そして、もし文字列の後部が欠けるのが嫌だ、という仕様での
作成であれば、必ずmallocをつかうべきでしょう。
本格的にやるときは、文字列を安全に扱うための
独自の構造体と関数群を用意するとよろしいかと。
実際、フリーソフトウェアのソースを見るとそのように
実装している例もあります。

No.1512

Re:文字列の十分な大きさ
投稿者---ともじ(2002/05/16 16:47:31)


大切なことをご指摘くださりありがとうございます。
通りすがりといわず、これからもよろしくお願いします。


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.22
Copyright(c) 2000-2002 TOMOJI All Rights Reserved