【问题标题】:Null pointer passed as argument 1作为参数 1 传递的空指针
【发布时间】:2017-12-09 12:45:07
【问题描述】:

int d = atoi(argv[2]); 行中似乎有问题。 “作为参数 1 传递的空指针...”

我能做什么?

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

int main(int argc, string argv[])
{

    int num;
    int i = 1;
    int j = 1;
    int board [i][j];

   // 2nd CL argument is size of grid.

    if (argc != 2)
    {
        return false;
    }

    int d = atoi(argv[2]);

    if (d <= 0)
    {
        return false;
    }

    // setting up board.

    // number of tiles needed.
    num = d * d - 1;

    // iterating over columns and rows
    for (i = 0; i <= d; i++)
    {
        for (j = 0; j <= d; j++)
        {
            // set values.
            board[i][j] = num;
            num --;
        }
         printf ("%d", board[i][j]); // TESTING.
         printf ("\n");
    }

   // if even swap 1 & 2. Don't display 1.
}

【问题讨论】:

  • 错误信息的哪一部分你不明白?
  • 程序强制执行 2 个参数,但随后尝试检查第三个参数。请记住,程序调用本身被计为一个参数,并且数组是零索引的。
  • argv[2]argv[]第三个 元素; argc == 2 时没有 argv[3]。

标签: c cs50 null-pointer


【解决方案1】:

argv[0] 包含用于启动程序的命令的名称。如果您需要两个命令行参数,请检查argc == 3 并从argv[1]argv[2] 读取命令行参数。

【讨论】:

    【解决方案2】:

    您的程序存在多个问题

    1) string 不是 C 中的标准类型。

    2) false 不是 C98 中的标准常量。

    标准 C(自 C99 起)提供了一种布尔类型,称为 _Bool。通过包含标题 stdbool.h,可以使用更直观的名称 bool 和常量 truefalse

    3) 你的板子有一个固定的尺寸 1x1 board[1][1]:

       int i = 1;
       int j = 1;
       int board [i][j];
    

    修复这个问题,否则你的程序会破坏内存。

    4) 您的电路板需要 2 个参数。参数从argv[] 中的argv[1]argv[2] 位置开始,因为第一个argv[0] 是您需要argc = 3 的程序的名称。

    【讨论】:

    • stringcs50.h 中定义。 false 用作值,而不是类型(_Bool 实际上是标准类型)。
    • 标准 C(自 C99 起)提供了一种布尔类型,称为 _Bool。通过包含头文件 stdbool.h,可以使用更直观的名称 bool 和常量 true 和 false
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2018-05-14
    • 2020-11-08
    相关资源
    最近更新 更多