int main(int argc, char* argv[]) 和线程 1: EXC_BAD_ACCESS (code=1, address=0x0) with atoi(argv[1]);在 Xc

Posted

技术标签:

【中文标题】int main(int argc, char* argv[]) 和线程 1: EXC_BAD_ACCESS (code=1, address=0x0) with atoi(argv[1]);在 Xcode 中【英文标题】:int main(int argc, char* argv[]) and Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) with atoi(argv[1]); in Xcode 【发布时间】:2022-01-10 04:51:09 【问题描述】:

我是 C 编程的新手,我正在尝试编写一个程序来读取一个命令行参数,该参数是数组的大小。我收到错误,线程 1:Xcode 中的 EXC_BAD_ACCESS (code=1, address=0x0)。

int main(int argc, char* argv[])

int size = atoi(argv[1]);

这是我的程序的一个 sn-p,我在其中使用具有随机值的排序函数,但我需要先读取数组的大小。

有什么建议吗?

【问题讨论】:

您是否传递了命令行参数?在 XCode 或类似软件中,如果通过工具本身运行,可能需要在配置对话框中指定。 总是在访问argv之前检查argc。 what-does-int-argc-char-argv-mean? 【参考方案1】:

你得到的“null”值几乎肯定意味着你正在阅读argv数组的末尾。例如,如果我运行一个程序: myprogram hello world

argc 将是 3 argv[0] 将是“我的程序” argv[1] 将是“你好” argv[2] 将是“世界” argv[3] 未定义,您甚至不应该尝试在这里读取数组! (但在大多数环境中可能为 NULL,以便程序可以预见地崩溃)

始终检查 argv 的索引是否小于 argc,因为 C 中的数组索引从 0 开始。

【讨论】:

我仍然对如何检查 argv 的索引小于 argc 感到困惑,但是如果我转到 Products->Scheme->Edit Scheme->Run->Arguments->Arguments Passed在 Xcode 中启动,并输入一个值,程序运行良好。您是否必须以某种方式调整 argc 或 argv(可能是 argv)? 不,C 运行时和操作系统会根据传递给程序的参数为您设置这些变量。正如 Anton K 在下面所说,您必须检查您想要的 argv[] 索引是否小于 argc【参考方案2】:

char* argv[] 是一个字符串数组(通常用作 char** argv) argc 为参数数量,0 参数为程序名,1 为第一个参数,2 为第二个参数,以此类推。

您需要检查 argv 的索引(名为 paramIndexThatIWant)小于 argc

例如

#include <stdio.h>

int main(int argc, char** argv)

      int paramIndexThatIWant = 2; /* param index that i want to use */
      if(argc > paramIndexThatIWant )
      
           printf("> Param %i equal value %s.\n",paramIndexThatIWant, argv[paramIndexThatIWant]);
      
      else
      
           printf("No parameter at pos %i, argc is %i\n", paramIndexThatIWant, argc);
      
      return 0;

再次记住 argc 将程序名称本身计为 1,因此如果您只有一个参数,那么它的值将是 1,这就是为什么在示例中我只有一个参数,argc 等于 2 但 argv[2 ] 不存在。

【讨论】:

以上是关于int main(int argc, char* argv[]) 和线程 1: EXC_BAD_ACCESS (code=1, address=0x0) with atoi(argv[1]);在 Xc的主要内容,如果未能解决你的问题,请参考以下文章

main (int argc,char *argv[]) 或main (int argc,char **argv)区别

int main(int argc,char* argv[])详解

int main(int argc,char*argv[])

int main(int argc,char* argv[]) 解析

int main(int argc,char* argv[])详解

int main(int argc,char* argv[])浅析