加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么使用atoi命令行参数进行分段错误

发布时间:2020-12-16 09:59:15 所属栏目:百科 来源:网络整理
导读:我需要传递两个命令行参数,我尝试了以下内容: #include stdio.h#include stdlib.hvoid 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("U
我需要传递两个命令行参数,我尝试了以下内容:

#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;
}

输出:

06001

直到这里的一切都没问题,但是如果在变量中保存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一切正常,这让我认为发生了分段错误,因为我试图访问那时不属于我的内存位置.

解决方法

is this issue happen because I try to access argv[1] and argv[2] and they are not exists when I type ./program?

是的,问题是您在验证命令行是否存在之前尝试访问命令行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]).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读