- ベストアンサー
char型配列の最大要素数
他の回答でchar型の最大要素数が257となっているのがあったのですが、これはいいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
あれ、こんなところで話題になっていたのですね。 元のプログラムを書いた者です。 >今まで私がやってきたプログラミングでは最大要素数は256とする物しかなかったので不審に思ったのです。 >256という数字には意味はないと言う事だったのでしょうか? まったく意味がないわけではありません。 Auto変数はスタックに取られるのが普通で、1 byte単位の端数を指定しても次の変数はアクセス可能な境界にあけて取られます。8 byte intのマシンでは、 int x; char c[2]; int y; とAutoを切っても、実際には、 int x; char c[8]; int y; とメモリはとられたりします。 ですから、特に細かい制限なしに大雑把にchar配列を確保する場合、2^nにとっておいたほうが無駄なく使える場合が多いのです。 今回は、「最大255文字」と指定があったので、必要十分な値として257と書きました。指定がなければ、BUFSIZと書いたと思います。 80と書く例が多いのは、昔のTTY端末が1行80colだった伝統のせいでしょう。 256は、128じゃ不足するかも、かといって512じゃ無駄使いかなといった微妙な心理から出てきた数値だと思います。 どっちにしても大きめの数を取ったからといって、gets(3)を使うのは危険です。stdinから入力する場合でも、fgetsを使ってBuffer Over Flowに備えるべきです。
その他の回答 (3)
- Trick--x--
- ベストアンサー率26% (19/72)
> 今まで私がやってきたプログラミングでは最大要素数は256とする物しかなかったので不審に思ったのです。 > 256という数字には意味はないと言う事だったのでしょうか? 要素数自体は#1の方も言っているように、好きにしてかまわないものです。 ただし、必要な量確保していないと大変なことになります。 どこから256が出てきたかと考えると、 0xFF + 1 と考えるのが自然……かな。 質問者さんがどのようなプログラムを見てきたか分からないのでなんとも言えませんが、趣味の範囲でしょうな。 私なんかは #define MAX_LEN (80) char szText[MAX_LEN+1]; とかよくやりますし。 特に指定されていない限り(「文字列は最大○文字とする」など)気にしなくていいのではないでしょうか。
- Trick--x--
- ベストアンサー率26% (19/72)
fgets()すると、文字列+改行+終端 をchar配列に入れることになる。 問題で、文字列を最大255文字としているので、改行+終端の2バイト分を足して257にしている。 ……と、No.10の方が言っていますね。 fgets()はgets()と違い、改行文字も格納されるのです。 char *fgets(char *szStr, int nCount, FILE *fp) fpからnCount-1文字 or 改行文字 or 終端文字までを読み込み、終端文字を付加してszStrに格納する あと、他の話題から派生させる時はその話題へのリンクがあったほうがいいと思います。 http://oshiete.nikkeibp.co.jp/kotaeru.php3?q=1872132
お礼
>他の話題から派生させる時はその話題へのリンクがあったほうがいいと思います。 ご指摘の通りです。申し訳ありません。 >問題で、文字列を最大255文字としているので、改行+終端の2バイト分を足して257にしている。 今まで私がやってきたプログラミングでは最大要素数は256とする物しかなかったので不審に思ったのです。 256という数字には意味はないと言う事だったのでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
何がどう悪いと思われたのでしょうか? 配列のサイズは、プログラマが適当に指定できます。 DLLなんかとやりとりする場合には、サイズを合わせる必要があるかもしれませんが、一般的には、自由に決められると思うのですが・ どういう文脈で使われたのかわからないので勘違いしてたらすみません。
お礼
派生先を書かないと分かりにくかったですね。 申し訳ありません。 回答ありがとうございます。
お礼
そんな理由があったのですね。一つ勉強になりました。 ありがとうございます。