我正在尝试制作一些简单的函数,对矩阵进行一些操作。但我不能理解为什么以下代码不起作用!你能帮我理解这里有什么问题吗?我该怎么办?
void create(int*** p, const int n)
{
*p = (int**)calloc(n, sizeof(int));
if(*p == NULL){
printf("Error1");
}
int i;
for(i = 0; i < n; i++){
(*(p[i]) = (int*)calloc(n, sizeof(int)));
if(*(p[i]) == NULL){
printf("Error2");
}
}
}
void initializeMatrix(int*** p, const int n)
{
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
scanf("%d", &((p[i][j])));
}
}
}
void show(const int** p, const int n)
{
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
printf("%d ", ((p)[i][j]));
}
printf("\n");
}
}
int main()
{
int** p = NULL;
create(&p, 2);
initializeMatrix(&p, 2);
show(p, 2);
return 0;
}
答案 0 :(得分:2)
您在*(p[i])
中使用create
。它应该是(*p)[i]
。
void create(int*** p, const int n)
{
*p = (int**)calloc(n, sizeof(int));
if(*p == NULL){
printf("Error1");
}
int i;
for(i = 0; i < n; i++){
// FIXED
(*p)[i] = (int*)calloc(n, sizeof(int)));
// FIXED
if( (*p)[i] == NULL){
printf("Error2");
}
}
}
您将错误的大小传递给函数中的第一个calloc
。您需要使用sizeof(int*)
。毕竟,您希望返回的值是指向n
的{{1}}指针的指针,而不是指向int
类型n
对象的指针。
这是导致未定义行为的严重错误,除非int
与您平台上的sizeof(int)
相同。
将行更改为
sizeof(int*)
更重要的是,通过返回指针可以使该功能更容易一些。编写这样的函数会更容易。
*p = (int**)calloc(n, sizeof(int*));
并将其用作:
int** create(int n)
int **p = calloc(n, sizeof(*p));
if(p == NULL){
printf("Error1");
}
int i;
for(i = 0; i < n; i++){
p[i] = calloc(n, sizeof(*p[i])));
if( p[i] == NULL){
printf("Error2");
}
}
return p;
}