#include"algorithm.h"
int** transpose(int**po
, int &m
, int &n
)
{
int*p
= (int*)malloc(m
*n
*sizeof(int));
int**pn
= (int**)malloc(n
*sizeof(int*));
int *save
= po
[0];
int *nSave
= p
;
for (int j
= 0; j
< n
; j
++)
{
for (int i
= 0; i
< m
; i
++)
{
*p
++ = *po
[i
];
po
[i
] = po
[i
] + 1;
}
}
p
= nSave
;
po
[0] = save
;
for (int j
= 0; j
< n
; j
++)
{
pn
[j
] = &p
[j
*m
];
}
free(po
[0]);
free(po
);
swap(m
, n
);
return pn
;
}
int main()
{
int m
, n
;
scanf("%d%d", &m
, &n
);
int**p
= new_arr2(m
, n
);
if (!p
)
return -1;
scan_arr2(p
, m
, n
);
p
= transpose(p
, m
, n
);
print_arr2(p
, m
, n
);
free(p
[0]);
free(p
);
return 0;
}
指针变化后不再指向原处,如果指针指向的是堆(malloc来的),则free时不注意就会导致堆头错误,上面有二级指针的话二级指针也无法正确解包拿到自增前的数据,比如这次实验就产生矩阵转置后全是杂乱值的情况,那是一级指针已经飘了,二级也遭殃了,所以要注意指针的变化是有潜在的陷阱的。
该程序改进方法是不要对传进的参数直接修改,而是新建临时指针变量用于处理,就像ps一般不直接对原图处理而是新建副本再处理。