1

我正在创建一个小型 C 程序,并且想要一个 char 指针数组,该数组只保存可执行文件开始时使用的参数。目前此代码还输出所有环境变量:

int main (int argc, const char * argv[]) {
   while(argv) {
      NSLog(@"Parameter %s\n", *argv);
      argv++;
   }
}
4

2 回答 2

3

不要像你那样做循环,而是使用 argc。argv 数组的大小是argc,第一个值argv[0]是正在执行的程序的名称。

int main (int argc, const char * argv[]) {
   for (int i = 1; i < argc; ++i) {
      NSLog(@"Parameter %s\n", argv[i]);
   }
}

您的代码也会转储环境变量,因为它们是在 argv 之后作为附加参数提供的。实际上,您正在为 argv 越界访问内存,这纯粹是运气。

于 2013-11-05T14:39:53.540 回答
2

更改while(argv)while(*argv)。那只会给你论据。

main()实际上是这样称呼的main(int argc, char **argv, char **environ)

正在发生的事情是你正在过去argv和进入environ。这种行为是未定义的,不应依赖。事实上,您的代码也将继续通过环境并且不会停止,您将打印垃圾。

当然,您也可以采用其他方式:

for(int i = 0; i < argc; i++) {
  NSLog(@"Parameter %s\n", argv[i]);
}

argv[0]包含程序名称,其余为参数。

于 2013-11-05T14:39:41.823 回答