Cの関数で使用されるコマンド ライン引数argc
、は、メモリのどこに格納されますか?arv[]
main
この質問で探しているストレージ領域は、ヒープ、データ セグメント、スタックなどである必要があります。
torekが彼の回答で述べたように、C 言語はコマンド ライン引数をどこに格納する必要があるかを定義していません。ただし、情報は通常、スタックに格納されます。
このコードは、共通の拡張子を使用しmain()
て環境も取得し、引数と環境の両方のアドレスを出力します。
#include <stdio.h>
#include <inttypes.h>
int main(int argc, char **argv, char **envp)
{
printf("&argc = 0x%.8" PRIXPTR "\n", (uintptr_t)&argc);
printf("&argv = 0x%.8" PRIXPTR "\n", (uintptr_t)&argv);
printf("&envp = 0x%.8" PRIXPTR "\n", (uintptr_t)&envp);
while (*argv != 0)
printf("*argv = 0x%.8" PRIXPTR "\n", (uintptr_t)*argv++);
while (*envp != 0)
printf("*envp = 0x%.8" PRIXPTR "\n", (uintptr_t)*envp++);
return 0;
}
私のMacで実行すると、次のように表示されました。
&argc = 0x7FFF5494B52C
&argv = 0x7FFF5494B520
&envp = 0x7FFF5494B518
*argv = 0x7FFF5494B748
*envp = 0x7FFF5494B74E
*envp = 0x7FFF5494B839
*envp = 0x7FFF5494B862
*envp = 0x7FFF5494B86D
*envp = 0x7FFF5494B889
*envp = 0x7FFF5494B8C1
*envp = 0x7FFF5494B8F4
*envp = 0x7FFF5494B905
*envp = 0x7FFF5494B915
*envp = 0x7FFF5494B920
*envp = 0x7FFF5494B92E
*envp = 0x7FFF5494B93B
*envp = 0x7FFF5494B974
*envp = 0x7FFF5494B998
*envp = 0x7FFF5494B9CD
*envp = 0x7FFF5494B9F2
*envp = 0x7FFF5494BA0B
*envp = 0x7FFF5494BA2A
*envp = 0x7FFF5494BA46
*envp = 0x7FFF5494BA7B
*envp = 0x7FFF5494BB2E
*envp = 0x7FFF5494BB3C
*envp = 0x7FFF5494BB76
*envp = 0x7FFF5494BB87
*envp = 0x7FFF5494BB9D
*envp = 0x7FFF5494BBC8
*envp = 0x7FFF5494BBEA
*envp = 0x7FFF5494BC2B
*envp = 0x7FFF5494BC35
*envp = 0x7FFF5494BC51
*envp = 0x7FFF5494BC5F
*envp = 0x7FFF5494BC75
*envp = 0x7FFF5494BC82
*envp = 0x7FFF5494BD55
*envp = 0x7FFF5494BD7E
*envp = 0x7FFF5494BD96
*envp = 0x7FFF5494BDA3
*envp = 0x7FFF5494BDAE
*envp = 0x7FFF5494BDBF
*envp = 0x7FFF5494BDCA
*envp = 0x7FFF5494BDE8
*envp = 0x7FFF5494BE01
*envp = 0x7FFF5494BE09
*envp = 0x7FFF5494BE1E
*envp = 0x7FFF5494BE38
*envp = 0x7FFF5494BE52
*envp = 0x7FFF5494BE71
*envp = 0x7FFF5494BE7D
*envp = 0x7FFF5494BEF5
*envp = 0x7FFF5494BF16
*envp = 0x7FFF5494BF27
*envp = 0x7FFF5494BF32
*envp = 0x7FFF5494BF66
*envp = 0x7FFF5494BF8D
これはまったく刺激的ではありませんが、すべてのアドレスが C スタックである同じ一般領域にあることを示しています。(Mac OS X 10.8.4 — 64 ビット プログラムでテストし、コマンド ライン引数を指定せずに起動し、環境を大きくしました。)