[英]Segmentation fault when trying to resize a 2D Array
這是代碼:
int **mat(int nl, int nc) {
int i;
int **v = malloc(nl * sizeof(int *));
for (i = 0; i < nl; i++) {
v[i] = calloc(nc, sizeof(int));
}
return v;
}
void crop(int **v,int *nl,int *nc,int l1,int c1,int l2,int c2)
{
int i,j;
for(i=0;i<(l2-l1);i++)
for(j=0;j<(c2-c1)*3;j++)
v[i][j]=v[l1+i][c1*3+j];
for(i=l2-l1;i<*nl;i++)
free(v[i]);
v=realloc(v,(l2-l1)*sizeof(int *));
for(i=0;i<*nl;i++)
v[i]=realloc(v[i],(c2-c1)*3*sizeof(int));
int x=l2-l1,y=c2-c1;
*nl=x;
*nc=y;
}
void resize(int **v,int *nl,int *nc,int nw,int nh)
{
int i,j,h=*nl,w=*nc,x=nh,y=nw;
if(nh>h && nw<=w)
{
crop(v,&w,&h,0,0,*nl,nw);
v=realloc(v,nh*sizeof(int *));
for(i=*nl;i<nh;i++)
{
v[i]=calloc(nw*3,sizeof(int));
for(j=0;j<=nw*3;j++)
v[i][j]=255;
}
}
if(nh<=h && nw>w)
{
crop(v,&w,&h,0,0,nh,*nc);
for(i=0;i<nh;i++)
{
v[i]=realloc(v[i],nw*3*sizeof(int));
for(j=*(nc)*3;j<=nw*3;j++)
v[i][j]=255;
}
}
*nl=x;
*nc=y;
}
int main(){
int nl,nc,i,j;
scanf("%d%d",&nc,&nl);
int **p = mat(nl,nc*3);
for(i=0;i<nl;i++)
for(j=0;j<nc*3;j++)
p[i][j]=i+j;
resize(p,&nl,&nc,2,4);
for(i=0;i<nl;i++)
{
for(j=0;j<nc*3;j++)
printf("%d ",p[i][j]);
printf("\n");
}
令nc=2,nl=3
因此,當我調用main resize(p,&nl,&nc,4,2)
,如果它首先裁剪矩陣的底部,導致新高度小於舊高度( nh
> nl
),在裁剪后繼續在其余的行(2)上,並重新realloc
內存,以便可以用{255,255,255}
填充新寬度,並且一切順利。
但是,當我調用resize(p,&nl,&nc,2,4)
,它會在第一個條件上繼續運行,如果調試器未顯示任何錯誤,並且它正在填充2D數組,但是當它進入printf
中的printf
時,我得到了分段故障。 可能是什么問題呢?
正如BLUEPIXY所提示的那樣,使用void crop
-> int **crop
並return v;
,我們必須考慮到realloc
可能會移動指向的區域,因此,為您的行指針數組調用realloc
的函數必須返回可能已更改的內存指針,並且調用函數將使用返回的值對其進行重新分配。 這不僅適用於函數crop()
,還適用於resize()
,因此必要的更改是:
int **crop(int **v, int *nl, int *nc, int l1, int c1, int l2, int c2)
{
…
return v;
}
int **resize(int **v, int *nl, int *nc, int nw, int nh)
{
…
v = crop(v, &w, &h, 0, 0, *nl, nw);
…
v = crop(v, &w, &h, 0, 0, nh, *nc);
…
return v;
}
int main()
{
…
p = resize(p, &nl, &nc, 2, 4);
…
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.