以前用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;
}
};