我正在尝试为2D矩阵分配内存,但是遇到了分段错误。
int** inicializarMatriz(int **matriz, int vertices){
int i;
matriz=(int**) calloc(vertices,sizeof(**matriz));
for(i=0;i<vertices;i++){
matriz[i]=(int*) calloc(vertices,sizeof(matriz[i]));
memset(matriz[i],-1,vertices*sizeof(matriz[i]));
}
return (int **)matriz;}
我该如何解决?
答案 0 :(得分:1)
我认为您对第一个分配内存有问题。
matriz=(int**) calloc(vertices,sizeof(**matriz));
应该是
matriz=(int**) calloc(vertices,sizeof(*matriz));
因为要创建格式为*(matriz + i)的顶点子数组。所以正确的大小是sizeof(* matrix)。
还有一个,这取决于您在main函数中的pass参数。假设您声明了2个指针:int * array&int ** array。当您在函数中传递它们时,它将返回不同的结果。
答案 1 :(得分:0)
安装一个名为valgrind的工具。通过valgrind运行程序。它会告诉您该段错误的确切原因,发生在哪一行以及为什么发生。 Valgrind对于此类问题至关重要。
此外...我认为您对使用sizeof()函数和其他一些东西感到很困惑。
我看到一个明确的段错误,我将其标记为//问题
int** inicializarMatriz(int **matriz, int vertices)
{
int i;
//Problem --> matriz=(int*)calloc(vertices,sizeof(int*));
for(i=0;i<vertices;i++)
{
matriz[i]=(int*) calloc(vertices,sizeof(int*));
memset(matriz[i],-1,vertices*sizeof(int*));
}
return matriz;
}
matriz是函数的输入。 C将该数据映射到静态内存。您正在尝试覆盖该静态内存,这将导致SEGFAULT。
您可以读取静态内存。您可以更改它所指向的内容(如果它是一个指针并指向已分配的内容)...但是您不能对其进行覆盖。
在其上安装并运行valgrind。它会告诉你所有这一切