2016-09-21 12 views
1

私はコマンドライン引数が文字配列であり、スタックに格納されていることを知っています。しかし、私は各引数のために割り当てられた実際のメモリを知りたい。例えばコマンドライン引数としてディレクトリ名 "/ tmp"を渡したとします。これはargv [1]に格納されます。しかし、私がテストしたところでは、プログラムでargv [1]を "/ tmp/log /"(サイズを増やしたもの)に変更することは許されています。これはどのように可能ですか?argv []にどのくらいのメモリが割り当てられていますか?

+5

「私は知っている」その後は事実関係のない推測が続きます。 –

+0

"しかし私はテストしましたが、プログラムではargv [1]を"/tmp/log/"(サイズが増えました)に変更することが許されています。はい、Cの標準では、 'argv'([N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)、セクション5.1.2.2.1、第2節、最後の制約)、「サイズを大きくする」はおそらくUBです。ゼロ終端された文字列と同じくらい多くの変更可能な 'char []'があると仮定してください。 –

+2

'argv [1] ="/tmp/log ")'の場合、 'argv [1]'が指し示す文字列のサイズを増やさず、あるポインタを別のものに置き換えます。私は 'strcat(argv [1]、"/log ")'が成功するとは思っていません。 – molbdnilo

答えて

1

は、あなたの質問に答えるために、引数文字列と渡された環境で使用可能な合計最大サイズを得ることができます詳細は、http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.htmlを参照してください。 (私のLinuxマシンでは、制限は2097152です)。

あなたの例は、引数と環境が現実的に連続して格納されているので、文字列に追加すると引数の後にくるもの(環境変数)に上書きされます。 そのようなargv文字列を試してみることは悪い考えです。それらを変更したい場合は、それらを編集するか縮小するが、それらを拡張しようとすると問題が発生する。

+1

これは非常にうまく答えます。さらに、argv [0] [0]の開始アドレスの後に100文字を出力しようとしました。引数と環境は実際には連続して格納されます。ありがとうございました。 – techiek7

1

Linuxの場合、パラメータにはcreate_elf_tablesが設定されます。この特定のプラットフォームでは、値がスタックに格納されていることが間違いありません。

Linuxは、引数と(初期)環境変数をスタックに格納するのに必要なだけのメモリを使用します。既に存在するものより多くを使用しようとすると、別のものを上書きしている(またはクラッシュしている)。

0

標準では、特殊な内部であるため、argvを変更することができます。

177 - パラメータargcとargvおよびargv配列が指す文字列は、プログラムによって変更可能で、プログラムの起動とプログラムの終了の間に最後に格納された値を保持するので、必要なものだけが割り当てられます割り当てまたは置換。

標準テキスト:

getconf ARG_MAX 
コマンドラインから

またはsyconf同等: http://c0x.coding-guidelines.com/5.1.2.2.1.html

+0

_proposed_ C標準を参照していることに注意してください。 – chux

関連する問題