如果我将函数声明为,例如:
void f1(int* a);
和简单向量:std::vector<int> v
- 我可以使用此向量作为此函数的输入:
f1(&v[0]);
但如果我有函数f2
,例如:
void f2(int** a);
和另一个向量:std::vector<int> *v
。如何将它与矢量数据一起使用?
目前我有一个动态分配的表,它使用函数f2
(f2(&tab,tablength)
)。它工作正常,但我必须另外发送tablength
。因为我现在正在改变程序的逻辑,我想我可以使用向量而不是经典表(因为我需要一个可以改变大小的数组)。但我堆积了。简而言之,f2
是一个函数,它将tab
乘以GF(2^8)
中的某个常量值。
答案 0 :(得分:4)
向量和指针指针是不同的东西。您必须实现逻辑以从一个转换为另一个。
在将此数组作为参数传递给f2
之前,您必须分配动态数组并将数据从向量复制到该数组。您还必须添加另一个参数来传递数组的大小。
答案 1 :(得分:3)
你 COULD :
int *p = &(*v)[0];
f2(&p);
然而,这可能不是你想要做的。不幸的是,如果不了解f2
实际上如何使用int **a
参数,很难说什么是正确的事情 - 也许实现第二个f2(std::vector<int>& av)
函数?
修改:看到修改后的问题,我建议您使用f2(std::vector<int>& av)
,并删除f2(int **)
变体。
答案 2 :(得分:1)
void f1(int* a);
是一个需要存储int
的内存地址的函数,在这种情况下(基于用法:f1(&v[0]);
)它是数组的第一个元素,此功能将修改的元素。
另一方面,void f2(int** a);
期望指向第一个元素的指针,这意味着该函数很可能会尝试更改指针本身。对于数组,此类函数很可能会重新分配数组(更改其大小)或完全取消分配它。在这种情况下,尝试执行int *p = &v[0]; f2(&p);
之类的操作会产生未定义的行为。
清晰且语义正确的解决方案是更改f2
函数以改为引用向量:void f2(std::vector<int>& v)
。通过引用传递矢量对象将允许此函数相对于传递给它的对象的生命周期更改其元素以及矢量本身。 (其中一个最大的后果就是完全消除了丑陋的内存管理,否则将是必要的。)