memset函数分割错误的问题

时间:2019-12-19 03:04:29

标签: c segmentation-fault

我正在尝试为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;}

我该如何解决?

2 个答案:

答案 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。它会告诉你所有这一切