以下代码应该复制另一个矩阵。但我得到一个分段错误:核心转储。 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
答案 0 :(得分:3)
我认为我如何利用memcpy是错误
不,那不是问题。问题是你对双指针和三指针的误解。
目前,在p
内分配双指针xmalloc
无效,因为指针是按值传递的。在xmalloc
调用之后,p1
和p2
继续指向未定义的位置,导致取消引用时出现段错误。
为了解决此问题您的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;