【问题标题】:"Debug assertion failed! expression: _p != nullptr" error“调试断言失败!表达式:_p!= nullptr”错误
【发布时间】:2019-10-02 12:34:30
【问题描述】:

error image我试图编写一个程序,用多个参数进行计算。 一切都按我的预期工作,除了我附上的图片中的最后一个。 每次我尝试在命令行中输入超过 2 个数字时,都会出现错误。

输入示例如下:program1.exe 12 + 13 - 2 + 1

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
    int a, b, rst;
    int i;
    char opr;

    if (argc > 100)
    {
        printf("Too many arguments!\n");
        return 0;
    }
    else if (argc <= 1)
    {
        printf("There are no arguments!\n");
        return 0;
    }

    a = atoi(argv[1]);
    rst = a;
    if (argc == 2)
    {
        a = atoi(argv[1]);
    }
    else if (argc % 2 != 0)
    {
        printf("Invalid fomula!\n");
        exit(0);
    }
    else
    {
        for (i = 1; 2*i <= argc; i++)
        {
            b = atoi(argv[2 * i]);
            opr = argv[2 * i - 1];
            switch (opr)
            {
            case '+':rst = a + b;
                break;
            case '-':rst = a - b;
                break;
            }

            rst = a;
        }
    }
    printf("%d", rst);

    return 0;
}

【问题讨论】:

  • 您是否在调试模式下单步执行代码以确定异常发生的确切位置?
  • 2*i == argc 时,您的循环将访问argv[argc]argv[argc] 是一个 NULL 指针。您的库对 atoi() 的实现断言它没有收到 NULL 指针,但您的代码给了它一个。严格来说,这是未定义的行为(即,您很幸运,您的 atoi() 给出了断言失败,而不是 - 比如说 - 重新格式化您的硬盘驱动器或更糟的东西)。
  • 短语opr = argv[2 * i - 1]; 试图将位于argv[2*1-1 的字符串分配给char 变量。
  • 您能否提供一个与此代码一起使用的命令行输入示例? (请使用该信息编辑您的帖子。)
  • @Jumen - 您没有提供任何关于 cmets 或答案的反馈。你的问题得到解答了吗?

标签: c command-line


【解决方案1】:

按原样运行代码,输入设置为:&lt;program.exe&gt; 2 + 5 这里出现空指针错误:

for (i = 1; 2*i <= argc; i++)
        {
            b = atoi(argv[2 * i]);//Null pointer for i==2
            opr = argv[2 * i - 1];
            switch (opr)

因为没有argv[4]。这导致 undefined behavior

如果不知道程序期望的输入是什么,就不可能准确地进行更正。因为你没有指定,我最好的猜测是程序尝试从命令行读取一组参数,例如:

argv[0]          argv[1]   argv[2]   argv[3]
<program>.exe    1         +         2

然后将读取的值转换为变量,并使用两个数字和一个数学运算符(例如+-)执行数学运算。

假设这是基本目标,以下示例将简化您现有的代码来执行这些步骤。注意对参数输入计数测试的更正,并降低循环索引:

#include <stdio.h>
#include <stdlib.h>

/// test using:
// prog.exe 2 + 3 3 - 4 6 + 7

//results are:
//result 0: 5
//result 1: -1
//result 2: 13

typedef struct {
    int n1;
    char opr;
    int n2;
    int result;
} CALC;


int main(int argc, char *argv[])
{
    int i;
    // test for correct number of input arguments
    if((argc-1)%3 !=0)
    {
        printf("Wrong number of inputs.\n");
        return 0;
    }

    // read in, and assign variables (use array of struct)
    int max = (argc-1)/3;  //guaranteed viable only after determining multiples are correct from above
    //Get ALL input into array variables
    CALC calc[max];
    for (i=0;i<max;i++)
    {
        //convert inputs into usable variables
        calc[i].n1  = atoi(argv[i*3+1]);
        calc[i].opr = argv[i*3+2][0];
        calc[i].n2  = atoi(argv[i*3+3]);

        // perform calulations
        switch(calc[i].opr) {
            case '+':
                printf("result %d: %d\n", i, calc[i].n1 + calc[i].n2);
                break;
            case '-':
                printf("result %d: %d\n", i, calc[i].n1 - calc[i].n2);
                break;
        }
    }

    return 0;
}

大部分错误检查和函数返回值的测试都由您来完成。

【讨论】:

  • 帮助很大。谢谢!
猜你喜欢
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2020-02-29
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多