微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为char矩阵2D数组创建输入函数?

如何解决如何为char矩阵2D数组创建输入函数?

我是C语言的新手,我写了以下代码,但不幸的是,它不起作用。错误是在写此行时C6011取消引用空指针和C6386缓冲区溢出:

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 ",1);
        }
    }
}

解决方法

函数参数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 );

您还可以将检查是否成功分配到内存中。

,

困惑时要遵循第一条原则!您需要在函数参数中添加额外的*

  • 您有char的数组元素。
  • 然后,您要排成一行(或以任何顺序排成一列)。这是char *,尽管在写时可以写得更干净一些。 char row[]
  • 您有一些这样的行,char **又名char matrix[][]
  • 然后,您想将指针传递给该函数,因此char ***也称为char *matrix_ptr[][]
  • 此时,您的功能需要设置*matrix_ptr = malloc(...)。我建议将其退回。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。