【问题标题】:How to create an input function for char matrix (2D array)?如何为字符矩阵(二维数组)创建输入函数?
【发布时间】:2021-01-31 08:39:05
【问题描述】:

我是 C 语言的新手,我编写了以下代码,但不幸的是,它不起作用。错误是 C6011 Dereferencing null pointer and C6386 Buffer overrun while writing for this line:

arr[i] = (char*)malloc(m * sizeof(char));

和 C6385 从 arr 和 C6011 读取此行的无效数据:

scanf_s("%c ", &arr[i][j],1);

另外,当我输入 1000 行 1000 个字符时,编译器会崩溃。我应该如何改进呢?

代码如下:

void individualTestCaseInput(char** arr, int n, int m) {
    arr = (char**)malloc(n * sizeof(char*));
    for (int i = 0; i < n; i++)
    {
        arr[i] = (char*)malloc(m * sizeof(char));
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++) {
            scanf_s("%c ", &arr[i][j],1);
        }
    }
}

【问题讨论】:

  • 你不需要一个三星级的设备吗?您正在覆盖参数,就好像它是一个局部变量一样,并且没有任何东西到达调用者。更容易和更清楚的是:将 2 星指针作为函数值返回。 char **individualTestCaseInput(int n, int m)

标签: c pointers pass-by-reference dynamic-memory-allocation function-definition


【解决方案1】:

在困惑时从第一原则构建!您需要在函数参数中添加一个额外的*

  • 您有char 的数组元素。
  • 然后,您希望拥有一行(或列,无论顺序如何)。这是char *,尽管在编写时写起来更干净,例如char row[]
  • 您有一些这样的行,char ** aka char matrix[][]
  • 然后你想将指针传递给函数,所以char *** aka char *matrix_ptr[][]
  • 此时您的函数需要设置*matrix_ptr = malloc(...)。我建议将其退回。

如果您确实最终仍使用matrix_ptr,则在通过指针引用数组元素时需要使用*,例如(*matrix_ptr)[][]

【讨论】:

    【解决方案2】:

    函数参数char **arr 是函数的局部变量,由参数表达式的值初始化。也就是说,参数是按值传递给函数的。局部变量的变化不影响原参数。

    通过以下方式声明和定义函数(即通过指向它的指针通过引用接受原始指针)

    void individualTestCaseInput( char ***arr, int n, int m ) 
    {
        *arr = malloc(n * sizeof(char *));
        for (int i = 0; i < n; i++)
        {
            ( *arr )[i] = malloc(m * sizeof(char));
        }
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++) {
                scanf_s(" %c", &( *arr )[i][j],1);
            }
        }
    }
    

    然后这样称呼它

    char **arr;
    //...
    individualTestCaseInput( &arr, n, m );
    

    或者按如下方式声明和定义函数

    char ** individualTestCaseInput( int n, int m ) 
    {
        char **arr = malloc(n * sizeof(char *));
        for (int i = 0; i < n; i++)
        {
            arr[i] = malloc(m * sizeof(char));
        }
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++) {
                scanf_s(" %c", &arr[i][j],1);
            }
        }
    
        return arr;
    }
    

    然后这样称呼它

    char **arr = individualTestCaseInput( n, m );
    

    您还可以在函数中包含内存是否分配成功的检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多