简单地说,我有一个模板类Tree,它有一个createTree(Data* arrayData[])
方法。此方法接收指向Data:
template<class Data>
void Tree<Data>::createTree(Data* arrayData[]) {
m_indexCreation = 0;
cout << sizeof(arrayData) / sizeof(int) << endl;
m_root = createChildTree(arrayData);
}
在我的main()
函数中,我创建了一个指向字符串对象的指针数组并填充它。然后我尝试将其传递给createTree()
方法,但在方法内部,数组的大小为1.换句话说,方法内的计数打印为“1”。
这是我的main()
:
int main() {
string* tab[20];
for ( int i = 0 ; i < 20 ; i++ ) {
if ( i % 3 != 0 ) {
tab[i] = new string("James Johnson");
} else {
tab[i] = NULL;
}
}
Tree<string> tree;
tree.createTree(tab);
tree.display(tree.getRoot());
}
我可以毫无问题地打印main()
中整个数组的值,但在createTree()
中,数组以某种方式减小到1的大小,单值为NULL。
我做错了什么?
答案 0 :(得分:1)
查看C FAQ
http://c-faq.com/aryptr/aryparmsize.html
答:编译器假装数组参数被声明为指针(即,在示例中,作为char * a;请参阅问题6.4),sizeof报告指针的大小。另见问题1.24和7.28。
解决方法。将大小作为参数传递。
void Tree<Data>::createTree(Data* arrayData[], int sz)
{
...
}
Tree<string> tree;
tree.createTree(tab, sizeof(tab)/sizeof(tab[0]));
答案 1 :(得分:1)
当tab
被发送到函数时,它将进行数组到指针的转换:
从C ++标准,4.2 [标准转换]
“N T数组”或“未知T的数组”类型的左值或右值可以转换为prvalue 类型“指针T”。结果是指向数组的第一个元素的指针。
因此,您的初始签名看起来与此类似:
Tree<Data>::createTree(Data** arrayData);
正如您所见arrayData
因为双指针。使用sizeof
时,它将返回指针的字节数,但不返回实际数组的字节数。要解决此问题,您应该通过引用传递数组:
template <class Data, unsigned N>
createTree(Data* (&arrayData)[N]); // you can print out N for the size
// but sizeof(x)/sizeof(*x) will still work
或者你可以使用std::vector
,因为它更容易获得大小:
#include <vector>
void Tree<Data>::createTree(std::vector<Data*> arrayData)
{
std::cout << arrayData.size();
}
int main()
{
std::vector<std::string> tab;
for (int i = 0; i < 20; ++i) // shortened for this example
{
tab[i] = new std::string("James Johnson");
}
...
}
在我看来,这是一个更清洁的选择。我希望这会有所帮助。