我的问题是使用sizeof()
时,结果是指针大小而不是指向的数组。
请帮帮我。
这是代码。
第一个函数创建一个二维矩阵,第二个函数在主要函数执行测试时显示该矩阵。
#include<iostream>
template<typename T>
T** Mat(T vals[],size_t m, size_t n){
T** mat=new T*[m];
for(size_t i=0;i<m;i++) mat[i]=new T[n];
for(size_t mi=0;mi<m;mi++){
for(size_t ni=0;ni<n;ni++){
mat[mi][ni]=vals[mi*(n-1)+ni];
}
}
return mat;
}
template<typename T>
void dispMat2d(T** mat){
for(size_t mi{};mi<sizeof(*mat)/sizeof(mat[0]);mi++){
std::cout<<"I'm here "<<sizeof(*mat)/*/sizeof(mat[0])*/<<"\n";
for(size_t ni{};ni<sizeof(*mat[0])/sizeof(mat[0][0]);ni++){
std::cout<<"o"<<mat[mi][ni]<<"\t";
}
std::cout<<std::endl;
}
}
int main(int c, char* arr[]){
double v[]={1.0,2,3,4,5,6};
auto myMat=Mat<double>(v,2,3);
dispMat2d(myMat);
return 0;
}
我尝试使用std::size()
,但是它不接受参数*myMat1
和**myMat1
。
预先感谢
答案 0 :(得分:3)
无论指针指向单个对象还是数组的第一个元素,指针都不会保留信息。
比较
int *p = new int();
和
int *p = new int[10]();
因此,两种情况下的sizeof( *p )
等同于sizeof( int )
。
因此,您必须显式传递数组的大小。
请注意Mat函数有一个错误。
代替
mat[mi][ni]=vals[mi*(n-1)+ni];
必须有
mat[mi][ni]=vals[mi * n + ni];
答案 1 :(得分:0)
数组作为参数传递给函数时会衰减为指针,因此大小信息会丢失。
一种可行的方法是将参数作为对特定大小数组的引用。
示例:
#include<array>
#include<iostream>
// helper
template<typename T, size_t Y, size_t X>
using mat_t = std::array<std::array<T, X>, Y>;
template<typename T, size_t Y, size_t X, size_t N>
auto Mat(const T (&vals)[N]) {
static_assert(Y*X<=N, "vals[] too small"); // compile time assertion
mat_t<T, Y, X> mat;
for(size_t mi=0; mi<Y; ++mi) {
for(size_t ni=0; ni<X; ++ni) {
mat[mi][ni] = vals[mi*X+ni]; // bugfix
}
}
return mat;
}
template<typename T, size_t Y, size_t X>
void dispMat2d(const mat_t<T, Y, X>& mat){
for(size_t mi=0; mi<Y; ++mi){
for(size_t ni=0; ni<X; ++ni) {
std::cout << 'o' <<mat[mi][ni] << '\t';
}
std::cout << '\n';
}
}
int main(){
double v[]={1,2,3,4,5,6};
auto myMat=Mat<double,2,3>(v);
dispMat2d(myMat);
}