我需要实现一个接收三重指针的 matrix_create 函数。
它编译得很好,但是当我运行它时,我得到了 Segmentation Fault 错误,可能是因为我在内存分配的某个地方搞砸了。
但是我找不到我的错误。
代码
#include <stdio.h>
#include <stdlib.h>
int matrix_create(int ***m, int ze, int sp);
void matrix_init(int **m, int ze, int sp);
int main (void)
{
int ze = 3;
int sp = 3;
int i,j;
int ***m = malloc(sizeof(int**));
*m = malloc(ze * sizeof(int*));
matrix_create(m, ze, sp);
matrix_init(*m, ze, sp);
for(i = 0; i < ze; ++i) {
for(j = 0; j < sp; ++j)
printf("%i\n", *m[i][j]);
}
return 0;
}
int matrix_create(int ***m, int ze, int sp)
{
int i, k;
if (!*m)
return 0;
for (i = 0; i < ze; ++i) {
*m[i] = malloc(sp * sizeof(int));
if (!*m[i]) {
for (k = 0; k < i; ++k)
free(*m[k]);
free(*m);
return 0;
}
}
return 1;
}
void matrix_init(int **m, int ze, int sp)
{
int i,j;
for(i = 0; i < ze; ++i) {
for(j = 0; j < sp; ++j)
m[i][j] = rand() % 1000;
}
}
最佳答案
索引运算符[]
优先于间接运算符*
。
参见C Operator Precedence .
这意味着你必须改变
*m[i]
到
(*m)[i]
在函数 matrix_create
中:
(*m)[i] = malloc(sp * sizeof(int));
if (!(*m)[i]) {
.....
}
在主程序中:
printf("%i\n", (*m)[i][j]);
关于使用三重指针创建矩阵会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48285809/