矩阵转置函数——指针自增的陷阱

#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;

	//布置转置矩阵
	// [1 2 3 4 5 6] --> [1 4 2 5 3 6]
	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一般不直接对原图处理而是新建副本再处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值