因此,我正在研究一個基於Linux的命令行實用程序,它必須接受幾個標誌,並且我注意到了一些有趣的行爲。我將發佈我在主實用程序之外使用的測試代碼。我正在使用這段代碼,所以我不必改變實際的工具,直到我有可以插入的工作代碼。因此,這裏是我一直在擺弄的代碼:argc,argv及其用法的有趣觀察
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
while(--argc && (*++argv)[0] == '-')
putchar('*');
printf("\n%s\n", argv[0]);
}
請忽略這一切程序將事實打印一個星號,當用一個參數調用-b打印自己的名字。星號的印刷只是爲了表明循環運行一次。所以,我在一個終端作爲「./test -n」跑這一點,我希望輸出爲:
* /測試
出乎我的意料,產量爲:
* -b
我對陳述 (*++argv)[0]
正在做什麼有一個工作理論,但我對它仍然有點朦朧。我的假設是,它遍歷指向數組的指針,查看每個指向的字符串中的第一個字符,(*++argv)[0]
現在取消引用*argv[0]
或第一個參數字符串的元素0。
所以,基本上我有三個問題:
- 到底是該語句在幹什麼?
- 無論我嘗試什麼,爲什麼我不能回到argv [0]或argv [0] [0]?
- 正在將argv [0]指向的地址的值存儲在另一個char *中,這是我能夠在此處訪問該值的唯一方式,這是正常的解決方法嗎?
我現在非常困惑,並且嘗試了所有我能想到的方法來解決這個問題。有一次我有一個打印字母表的循環,我不知道該程序正在訪問什麼內存部分。最有趣的排列是從某個地方抽取sshid變量。
非常感謝大家的幫助。
那麼我的假設是正確的。這是常見的事情嗎?我以前沒有遇到過這個問題。 – Brandon 2012-02-06 05:40:23
這只是在* C *中增加數組指針的語義。它沒有什麼特定的程序參數傳遞。 – 2012-02-06 05:43:02
我想說這是相當常見的用法。對於(i = 0; i
2012-02-06 05:46:44