当参数是指向数组的取消引用的指针时,为什么sizeof()不能按预期工作?

问题描述 投票:0回答:2

我的问题是使用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。在此先感谢

c++ pointers c++17 sizeof
2个回答
1
投票

指针无论指向单个对象还是指向数组的第一个元素,都不会保留信息。

比较

int *p = new int();

int *p = new int[10]();

因此,在两种情况下sizeof( *p )都等于sizeof( int )

因此,您必须显式传递数组的大小。

请注意,功能Mat有一个bug。

代替

mat[mi][ni]=vals[mi*(n-1)+ni];

必须有

mat[mi][ni]=vals[mi * n + ni];

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.