歷史上大多數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 第二個形參 ...