获取动态数组的长度

时间:2011-12-03 13:54:47

标签: c++ arrays dynamic

继续关联的问题Dynamic template arrays,还有两件事我想解释:

  1. 编译器收到一条警告:复制命令不安全:“带有可能不安全参数的函数调用 - 此调用依赖于调用者来检查传递的值是否正确” 这个问题有多严重,可以做些什么来克服它?

  2. 最重要的是: 我不能用常见的方式正确地获得数组的长度。尽管数组包含3个元素,但数组的最终大小计算为1。代码中是否存在缺陷,或者由于动态数组而导致其他方式有所不同?

  3. 这是我的代码:

    template<typename T>
    void VectorHolder<T>::setArrays(T firstarray[],T secondarray[] ,int N1, int N2)
    {
    
        array1 = new T[N1];
        array2 = new T[N2];
    
        std::copy(firstarray, firstarray + N1, array1);
        std::copy(secondarray, secondarray + N2, array2);
    
        int arraysize = sizeof(array1)/sizeof(T);
    
        cout<<"\narraysize: "<<arraysize<<endl;
        cout<<"\nFirst array contains: \n";
    
        for(int i=0; i<arraysize;i++)
            cout<<array1[i]<<endl;
    }
    

    我只在输出中输入一个元素,但数组包含三个元素。如果我将for循环更改为

    for(int i=0; i<N1;i++) 
    

    我得到了正确的结果。为什么呢?

4 个答案:

答案 0 :(得分:3)

您是否考虑过使用std::vector及其size方法?

答案 1 :(得分:2)

array1不是数组,而是指针。因此,它的大小是指针的大小,并且是常量。

考虑使用标准容器而不是原始C样式数组。

答案 2 :(得分:2)

问题1:

不要太在意这个警告。它会警告您有溢出的风险。 要摆脱它,如果您使用的是Visual Studio,请将其添加到您的文件中:

#pragma warning( disable : 4996 )

我假设4996是此警告的代码。

问题2:

你有这样的事实:

array1 = new T[N1];

表示 array1 是T:

上的指针
T * array1;

假设N2比N1大得多,虽然你会发现 sizeof(array1)等于sizeof(array2)

我想这是因为sizeof(array1)返回为指针本身分配的内存而不是指针指向的值,但不确定这个〜。

一个简单的测试:

char * tab1;
tab1 = new char[3];

char * tab2;
tab2 = new char[100];

if( sizeof(tab1) == sizeof(tab2) )
{
    printf("equals");
}

将返回:“等于”

要解决此问题,请尝试以下

std::vector<T> array1;

并考虑通过以下方式获得尺寸:

array1.size();

答案 3 :(得分:1)

如果确实想要使用动态数组,那么请正确执行: 永远不要使用[],但始终只使用指针。最令人讨厌的是,你必须分别通过数组的大小注意你的数组delete。这两个问题在复杂的程序中都很棘手,使用容器来处理它们是非常优选的。