由于不使用三指针而导致分段错误

时间:2016-01-17 09:37:24

标签: c arrays pointers dynamic

以下代码应该复制另一个矩阵。但我得到一个分段错误:核心转储。 xmalloc函数分配数组,init初始化它,复制复制它,xfree释放空间。我认为我如何利用memcpy是错误,我该如何解决?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int xmalloc(int **p, int dim1, int dim2);
void xfree(int **p, int dim1);
void init(int **p, int dim1, int dim2);
void copy(int **source, int **destination, int dim1, int dim2);

int main(void)
{
    int **p1, **p2, dim1, dim2;

    scanf("%d\n%d",&dim1,&dim2);

    if(!xmalloc(p1,dim1,dim2))
        return -1;

    if(!xmalloc(p2,dim1,dim2))
        return -1;

    init(p1,dim1,dim2);

    copy(p1,p2,dim1,dim2);

    xfree(p1,dim1);
    xfree(p2,dim2);

    return 0;
}

int xmalloc(int **p, int dim1, int dim2)
{
    int i;

    p=malloc(dim1*sizeof(int*));
    if(p==NULL)
    {
        perror("Malloc");
        return 0;
    }
    for(i=0; i<dim1; i++)
    {
        p[i]=malloc(dim2*sizeof(int));
        if(p[i]==NULL)
        {
            perror("Malloc");
            return 0;
        }
    }
    return 1;
}

void xfree(int **p, int dim1)
{
    int i;

    for(i=0; i<dim1; i++)
        free(p[i]);
    free(p);
}

void init(int **p, int dim1, int dim2)
{
    int i, j;

    for(i=0; i<dim1; i++)
        for(j=0; j<dim2; j++)
            p[i][j]=i*dim2+j;
}

void copy(int **source, int **destination, int dim1, int dim2)
{
    int i;

    for(i=0; i<dim1; i++)
    {
        memcpy(destination[i],source[i],dim2*sizeof(int));
    }
}

错误是什么? 请允许我使用scanf来简化此程序。

解决方案:

- 使用三重指针

- 将参数传递给xfree

1 个答案:

答案 0 :(得分:3)

  

我认为我如何利用memcpy是错误

不,那不是问题。问题是你对双指针和三指针的误解。

目前,在p内分配双指针xmalloc无效,因为指针是按值传递的。在xmalloc调用之后,p1p2继续指向未定义的位置,导致取消引用时出现段错误。

为了解决此问题您的xmalloc功能

int xmalloc(int **p, int dim1, int dim2);

应如下所示:

int xmalloc(int ***p, int dim1, int dim2);

里面的作业

p=malloc(dim1*sizeof(int*));

应该是

*p=malloc(dim1*sizeof(int*));

并且通话应该看起来像

if(!xmalloc(&p1,dim1,dim2))
    return -1;

if(!xmalloc(&p2,dim1,dim2))
    return -1;