为什么使用atoi命令行参数进行分段错误
我需要传递两个命令行参数,我尝试了以下内容:
#include <stdio.h> #include <stdlib.h> void power(int base,int exp){ int res=1; while(exp!=0){ res *= base; --exp; } printf("Res = %d",res); } int main(int argc,char *argv[]) { if (argc != 3) { printf("Usage %s arg2 arg2n(EG: %s 2 3)n",argv[0],argv[0]); exit(1); }else{ power(atoi(argv[1]),atoi(argv[2])); } printf("n"); return 0; } 输出:
直到这里的一切都没问题,但是如果在变量中保存argv [1]和argv [2],就像这样: int base = atoi(argv[1]); int exp = atoi(argv[2]); 我得到Segmentation故障 码: #include <stdio.h> #include <stdlib.h> void power(int base,char *argv[]) { int base = atoi(argv[1]); int exp = atoi(argv[2]); if (argc != 3) { printf("Usage %s arg2 arg2n(EG: %s 2 3)n",argv[0]); exit(1); }else{ power(base,exp); } printf("n"); return 0; } 但是当我在printf中使用Atoi时一切都还可以: #include <stdio.h> #include <stdlib.h> void power(int base,char *argv[]) { if (argc != 3) { printf("Usage %s arg2 arg2n(EG: %s 2 3)n",atoi(argv[2])); } printf("n"); return 0; } 我的问题是: 这个问题是因为Atoi而发生的吗? 这个问题发生是因为我试图访问argv [1]和argv [2]并且当我输入./program时它们不存在? 如果我输入./program 2 3一切正常,这让我认为发生了分段错误,因为我试图访问那时不属于我的内存位置. 解决方法
是的,问题是您在验证命令行是否存在之前尝试访问命令行arg. 在第二个示例代码段中,仅在确保输入可用后才将值分配给变量base和exp. int base; int exp; if (argc != 3) { printf("Usage %s arg2 arg2n(EG: %s 2 3)n",argv[0]); exit(1); }else{ /* Assign the values here,as it is verified that arg's are obtained from cmd line*/ base = atoi(argv[1]); exp = atoi(argv[2]); power(base,exp); } 在上面的程序中,只有当程序执行时它们作为命令行参数传递时,才能确保引用args(argv [1]和argv [2]). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Swift 之父 Chris Lattner 加入 Google B
- ruby-on-rails – Ruby:在转换数组中的对象后传
- 如何使用splat运算符进行并行赋值在Ruby中工作?
- 关于使用ajaxSubmit异步提交数据时,IE7,8出错的
- PostgreSQL数据库日常学习笔记3-数据查询
- React和React Native等学习资源整理
- winforms – TableLayoutPanel的行/列着色(vs200
- postgresql 学习
- c# – ClickOnce无法在Windows Vista SP2上安装L
- ruby-on-rails-3 – surround.vim:删除嵌入的ru