關於main函式的引數

2021-08-19 04:01:24 字數 2196 閱讀 2166

歷史上大多數unix系統支援main函式帶有三個引數:

int main(int argc, char *argv, char *env);
extern char **environ;
因為iso c規定main函式只有兩個引數,所以posix.1也規定應使用environ而不使用第三個引數。

下面的例子展示了main函式的引數:

include #include 

#include

#include

extern char **environ;

int main(int argc, char *argv, char *env)

assert(argv[argc] == null);

char **p = argv+argc+1;

printf("environment address: %p

%p%p\n", p, env, environ);

printf("environment:\n");

while(*p)

assert(*p++ == null);

printf("auxiliary vectors:\n");

#ifdef __x86_64__

elf64_auxv_t *aux = (elf64_auxv_t*)p;

#else

elf32_auxv_t *aux = (elf32_auxv_t*)p;

#endif

while(aux->a_type != at_null)

return

0;}

c程式的典型儲存器安排是這樣的:

命令列引數和環境變數   高位址

------------------

棧------------------

堆------------------

未初始化的資料

------------------

初始化的資料

------------------

程式正文 低位址

環境表和環境字串通常占用的是程序位址空間頂部,它下面是棧空間,所以它不能向上(高位址)又不能向下(低位址)擴充套件。如果要增加乙個環境變數,操作就比較複雜了。

如果是第一次增加乙個新name,呼叫malloc為新的環境表分配空間,然後將原來的環境表複製過來,並將指向新name=value字串的指標放到環境表的尾部,再將乙個空指標放在其後,最後更新environ使之指向新環境表。由於evnp是值傳遞的,它的值並不會進行更新。

如果不是第一次增加乙個新name,只要呼叫realloc擴充套件空間,然後將指向新name=value字串的指標放到環境表的尾部,再將乙個空指標放在其後。此時environ的值可能變化也可能不變。

第一次增加新name時,複製原來的環境表這一步可能是通過environ去尋找舊的環境表,所以使用者程式最好不要修改environ的值。

有兩個函式可以增加乙個新的環境變數:

#include int putenv(chat *str);

int setenv(const char *name, const char *value, int rewrite);

setenv會分配儲存區,以便存放name=value字串。putenv則可能直接把傳遞給它的字串位址放入環境表尾部,如果這字串是存放在棧中則可能會發生錯誤。

以下例程展示了增加乙個環境變數的操作:

#include 

#include

extern char **environ;

int main(int argc, char *argv)

; printf("putenv\nbuf address is p\n",buf);

putenv(buf);

printf("new environ is %p\n",environ);

p = environ;

while(*p) ++p;

if(environ)

return

0;}

參考

程式設計師的自我修養

unix環境高階程式設計 7.6 c程式的儲存空間布局

unix環境高階程式設計 7.6 環境變數

關於帶引數的main函式

main 函式既可以是無參函式,也可以是有參的函式。對於有參的形式來說,就需要向其傳遞引數。但是其它任何函式均不能呼叫main 函式,當然也無法向main 函式傳遞,只能由程式之外傳遞而來。這個具體的問題怎樣解決呢?我們先看一下main 函式的帶參的形式 main argc,ar int argc,...

main函式的引數

c程式最大的特點就是所有的程式都是用函式來裝配的。main 稱之為主函式,是所有程 序執行的入口。其餘函式分為有參或無參兩種,均由main 函式或其它一般函式呼叫,若呼叫 的是有參函式,則引數在呼叫時傳遞。main f1 int a,int b f2 int m,int n 在前面課程的學習中,對m...

main函式的引數

main函式可以不帶引數,也可以帶引數,這個引數可以認為是 main函式的形式引數。c語言規定main函式的引數只能有兩個,習慣上這兩個引數寫為argc和argv。因此,main函式的函式頭可寫為 main argc,argv c語言還規定argc 第乙個形參 必須是整型變數,argv 第二個形參 ...