关于malloc的提问
  • 板块灌水区
  • 楼主羊摆摇
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/5/18 14:23
  • 上次更新2023/10/23 15:26:47
查看原帖
关于malloc的提问
497817
羊摆摇楼主2023/5/18 14:23

以前用malloc挺顺手的,最近想把矩阵的内容装进结构体里面,结果不知道抽了什么东西,一直只给我分配8个字节,换成new分配内存也会祭...希望有大佬解释一下为什么

局部代码:

matrix(Int &r,Int &c,const LL &m=LL_MAX,Int &p=1):R(r),C(c),M(m){
		A=(LL **)malloc(sizeof(LL)*r*c );//这里在抽
		cout<<sizeof(A)<<endl;
		memset(A,0,sizeof(A));
		if(p)for(int i=0;i<min(r,c);i++)A[i][i]=p;
	}

整体:

struct matrix{
	#define LL long long
	typedef const int Int;
	typedef const matrix Mat;
	#define LL_MAX 0x7fffffffffffffff
	LL **A=NULL;
	int R,C;
	Int M;
	matrix(Int &r,Int &c,const LL &m=LL_MAX,Int &p=1):R(r),C(c),M(m){
		A=(LL **)malloc(sizeof(LL)*r*c );
		cout<<sizeof(A)<<endl;
		memset(A,0,sizeof(A));
		if(p)for(int i=0;i<min(r,c);i++)A[i][i]=p;
	}
	
	void cpy(auto &b){
//		cout<<sizeof(b)<<" "<<sizeof(*b)<<" "<<sizeof(**b)<<" "<<sizeof(b)/sizeof(**b)*sizeof(LL)<<endl;
		R=sizeof(b)/(sizeof(*b));
		C=sizeof(*b)/sizeof(**b);
		Int sz=sizeof(LL)*(sizeof(b)/sizeof(**b));
		cout<<sz<<endl;
		A=(LL **)new LL[sz];//这里也在抽
		cout<<sizeof(A)<<endl;
//		cout<<R<<" "<<C<<endl;
		for(int i=0;i<R;i++){
//			for(int j=0;j<C;j++)/*A[i][j]=b[i][j],*/cout<<b[i][j]<<endl;
		}
	}
	
	void swap(matrix &b){
		std::swap(R,b.R);
		std::swap(C,b.C);
		std::swap(A,b.A);
//		std::swap(M,b.M);// 想要实现同时转换模数的话需将Int M换成int M再把注释去掉 
	}
	
	LL* operator [](Int &a){
		return A[a];
	}
	
	const LL* operator [](Int &a)const{
		return A[a];
	}
	
	matrix operator +(Mat &b){
		matrix ans(R,C,M);
		for(int i=0;i<min(R,b.R);i++){
			for(int j=0;j<min(C,b.C);j++)ans[i][j]=(A[i][j]+b[i][j])%M;
		}
		return ans;
	}
	
	void operator +=(Mat &b){
		for(int i=0;i<min(R,b.R);i++){
			for(int j=0;j<min(C,b.C);j++)A[i][j]=(A[i][j]+b[i][j])%M;
		}
	}
	
	matrix operator *(Mat &b){
		matrix ans(R,b.C,M);
		for(int i=0;i<R;i++){
			for(int j=0;j<b.C;j++){
				for(int k=0;k<min(C,b.R);k++)ans[i][j]=(ans[i][j]+A[i][k]*b[k][j])%M;
			}
		}
	}
	
	void operator *=(Mat &b){
		matrix ans(R,b.C,M);
		for(int i=0;i<R;i++){
			for(int j=0;j<b.C;j++){
				for(int k=0;k<min(C,b.R);k++)ans[i][j]=(ans[i][j]+A[i][k]*b[k][j])%M;
			}
		}
	}
	
	matrix pow(int x){
		matrix m=*this,ans(R,R,M,1);
		while(x){
			if(x&1)ans*=m;
			m*=m;
			x>>=1;
		}
		return ans;
	} 
};
2023/5/18 14:23
加载中...