获取动态数组的长度
Get the length of dynamic array
继续链接的问题动态模板数组,还有两件事我想解释:
-
我收到编译器的警告,复制命令是不安全的:"带参数的函数调用可能是不安全的-此调用依赖于调用者检查传递的值是否正确"这个问题有多严重,我们可以做些什么来克服它?
-
最重要:我不能用一般的方法正确地得到数组的长度。数组的最终大小计算为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++)
我得到正确的结果。为什么?
您是否考虑使用std::vector
及其大小方法?
array1
不是数组,它是指针。因此,它的大小是指针的大小,并且是常数。
考虑使用标准容器而不是原始的c风格数组。
问题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");
}
将返回:"equals"
要解决此问题,请执行:
std::vector<T> array1;
,并考虑通过:
array1.size();
如果你真的想要使用动态数组,那就正确使用:从不使用[]
,但总是只使用指针。最恼人的是,必须分别传递数组的大小,和注意delete
您的数组。这两个问题在复杂的程序中都很棘手,使用容器来解决它们是更可取的。
相关文章:
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结