【问题标题】:Segmention fault because not using triple pointers分段错误,因为没有使用三指针
【发布时间】:2016-04-22 13:47:33
【问题描述】:

以下代码应将一个矩阵复制到另一个矩阵中。但我得到一个分段错误:核心转储。 xmalloc 函数分配数组,init 初始化它,copy 复制它,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

【问题讨论】:

    标签: c arrays pointers dynamic


    【解决方案1】:

    我认为我使用 memcpy 的方式是错误的

    不,这不是问题所在。问题是您对双指针和三指针的误解。

    目前xmalloc内部的双指针p的赋值没有效果,因为指针是按值传递的。在调用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;
    

    【讨论】:

    • @SimoneBonato 出于同样的原因,您需要将指针而不是int 传递给scanf。否则,xmalloc 内部的赋值效果为零。
    • @SimoneBonato 你的其他功能看起来不错。
    • 如果插入 5 和 8 作为输入,我在 copy 函数之后添加,例如,printf("%d",p2[1][1]); 我收到另一个核心转储。
    • @SimoneBonato 你有没有在*p 周围加上括号xmalloc? IE。 (*p)[i]=malloc(dim2*sizeof(int));if((*p)[i]==NULL)?
    • 是的,我有。在初始化函数printf("%d",p[i-1][j-1]); 中工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2021-12-28
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多