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[]) 解析