因此,我正在研究一个基于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