我在尝试写入使用以下函数分配的矩阵的第二行(段错误 exc_bad_access
和 kern_invalid_address
)时遇到问题:
这是我的分配函数:
int amatrix(char*** m, const int i, const int j)
{
int k;
(*m) = (char**) malloc(sizeof(char*) * i);
if ((*m) == NULL) {
return ERROR;
}
for (k = 0; k < i; k++) {
(*m)[k] = (char*) malloc(sizeof(char) * j);
if ((*m)[k] == NULL) {
return ERROR;
}
}
return SUCCESS;
}
我使用以下方式调用它:
char** matrix;
if (amatrix(&matrix, i, j)) { ...
编辑: 根据要求:
#define ERROR 00
#define SUCCESS 01
问题所在的访问:
int gmatrix(char*** m, const int i, const int j)
{
int k, l;
for (k = 0; k < i; k++) {
for (l = 0; l < j; l++) {
printf("Matrix[%d][%d] = ", k, l);
scanf(" %c", m[k][l]);
}
}
return SUCCESS;
}
感谢您的快速回复!
最佳答案
您的gmatrix
函数应将m
作为char**
参数,而不是char***
,因为它不需要像 amatrix 那样更改其值(仅更改其指向的值)。
那么您应该将 scanf 调用更改为:
scanf(" %c", &m[k][l]);
您当前的代码(使用char*** m
)不起作用,因为当k!=0<时
,因为 m[k]
将给出未定义的行为m
仅指向单个 char**
。
如果 m
是 char***
,则 scanf 调用需要如下所示:
scanf(" %c", &(*m)[k][l]);
关于c - 2d矩阵分配函数segfault(参数返回的矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13270899/