C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么使用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 arg2\n(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 arg2\n(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 arg2\n(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 arg2\n(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]).

大佬总结

以上是大佬教程为你收集整理的为什么使用atoi命令行参数进行分段错误全部内容,希望文章能够帮你解决为什么使用atoi命令行参数进行分段错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。