GETとPOSTでデータを受け取る時にmallocは必要?

[上に] [前に] [次に]
Kzw 2000/02/17(木) 06:38:53
 こんにちは、ちょっと思った事なんですがご存知の方いらっしゃいま
したらお願いします<m(__)m>

CGIでデータをうけとる時、mallocで動的に領域を確保する必要
ってGETの場合必要あるんでしょうか?
POSTだと必要だという事はわかるのですが、GETの場合
制限があるんで必要無いですよね?

kept 2000/02/17(木) 10:17:57
C言語でのCGIの話ですよね?

>POSTだと必要だという事はわかるのですが、GETの場合
>制限があるんで必要無いですよね?
GETの場合、環境変数QUERY_STRINGに既にデータが格納されてい
るので、必要ないと思います。

ただ、そのデータをコピーする場合はmalloc、配列などでメモリを
確保する必要があるとは思いますが。

Kzw 2000/02/17(木) 13:43:44
 こんにちは、keptさん
レスありがとうございます<m(__)m>

>C言語でのCGIの話ですよね?

はい、そうです

QUERY_STRINGは中身に制限が無いんでしょうか?
QUERY_STRINGにセットされるサイズというのは
限界が無いって事でしょうかねえ?
その辺がよくわからんのです

コウノトリ 2000/02/17(木) 14:04:46
>QUERY_STRINGは中身に制限が無いんでしょうか?

あります。限界の大きさはOSによって違います。
誤解されているようですが、mallocが必要かどうかという問題と、限界の有無は何の関係もありません。
GET引数をQUERY_STRINGから取得するgetenv関数は内部で領域を確保してくれるということです。

kept 2000/02/17(木) 14:07:25
確か制限があったはずですが、詳しいことは知りません。
ごめんなさい。

HTTPの制限だったような気がするのですが、
詳しい方のフォローをお願いします。

B-Cus 2000/02/17(木) 15:21:35
POST だって、例えば
 char buf[8192];
 fgets(buf,sizeof(buf),stdin);
でも問題ない場合もあるでしょ。

必要がある/ない、ということではなく、プログラマが
どっち方針を選択するか (無限長のデータを読み込めるように
するのか、あるサイズまでのデータを読めればいいのか)、
ということです。

GET の限界は処理系依存です。apache なら 8000バイトくらい。
環境変数の長さの限界は知らない。でも、本質的には malloc とは
全く関係ないです。

Kzw 2000/02/18(金) 09:20:27
 みなさんありがとうございました<m(__)m>
下手な質問でご迷惑おかけしました。

B-cusさん
>必要がある/ない、ということではなく、プログラマが
>どっち方針を選択するか (無限長のデータを読み込めるように
>するのか、あるサイズまでのデータを読めればいいのか)、
>ということです。

あ、そうです私が言いたかったのは無限長のデータを送られた
時にどうすればよいのかってのを知りたかったんです(^^;
なんか遠まわしの質問をしてしまっていたか・・・

コウノトリさんの
>あります。限界の大きさはOSによって違います。
と、B-cusさんの
>GET の限界は処理系依存です。

からまとめると
POSTで受け取る時にはサイズを確認して一定以上なら
受け取らないようにしなければならないけど
GETならそのまま受け取る
(サイズを確保する以前に)

とこれでいいでしょうか?

コウノトリ 2000/02/18(金) 13:48:44
例として、一般的に使われている方法を書きます。

GETの場合:
char *str = NULL;
*str = getenv("QUERU_STRING");
getenvの中で動的にメモリを割り当ててくれるので
ユーザが明示的にmallocする必要はありません。

POSTの場合:
int len;
char *length;
char *str;
length = getenv("CONTENT_LENGTH");
len = atoi(length);
str = malloc(len);
fgets(str, len, stdin);
長さを取得して、その値でアロケートします。
長さはgetenvで文字列として取得するのでGETと同じでmallocはしません。

つまり、GETでもPOSTでも、プログラムを作るときには何バイトくるかは
分からないので、動的にメモリを確保する必要はあるわけです。
ただ、getenvは内部でmalloc相当のことをしてくれる・・・というだけです。

Kzw 2000/02/18(金) 18:43:06
[[解決]]
 コウノトリさんありがとうございます<m(__)m>
例まで出していただいちゃって

はい、理解できました 皆さんありがとうございました。
これにて解決とさせていただきます
またなにかのさいにはよろしくお願いします

[上に] [前に] [次に]