问题描述
我是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)[][]
。