C++ 如何初始化一个变量,它是指向结构指针数组的指针?
我需要从第三方来源调用函数。函数需要以下类型的参数:C++ 如何初始化一个变量,它是指向结构指针数组的指针?,c++,c,pointers,C++,C,Pointers,我需要从第三方来源调用函数。函数需要以下类型的参数: StructureName *(*parameterName)[] 在一个示例中,它被定义为指针数组: StructureName * MagneticModels[1] 它通过“&”运算符传递给函数。不幸的是,在Visual Studio 2013中,它未能编译: 错误C2664:(…)无法将参数(…)从“StructureName*(*)[1]”转换为“StructureName*(*)[]” 因此,为了让它编译,我添加了一个新变量并
StructureName *(*parameterName)[]
在一个示例中,它被定义为指针数组:
StructureName * MagneticModels[1]
它通过“&”运算符传递给函数。不幸的是,在Visual Studio 2013中,它未能编译:
错误C2664:(…)无法将参数(…)从“StructureName*(*)[1]”转换为“StructureName*(*)[]”
因此,为了让它编译,我添加了一个新变量并将其传递给函数:
StructureName *(*variableName)[];
现在它编译时没有错误,但是我得到一个运行时错误,即使用“variableName”时没有初始化
我尝试了很多方法来初始化,但我不是C++开发者,所以这是一个真正的考验,一天之后我一无所获。因此,如果函数需要
StructureName*(*parameterName)[
参数,那么将指向StructureName*MagneticModels[1]
数组的指针传递给此类函数的唯一方法是使用带有显式强制转换的&
运算符
foo((StructureName *(*)[]) &MagneticModels);
(通过对数组类型使用typedef
,可以使其更具可读性)
另一个漏洞是,可以使用未知大小声明数组,然后使用特定大小定义数组。只要编译器在调用时只知道“unknown size”声明,它就允许您在不进行强制转换的情况下传递它
extern StructureName * MagneticModels[]; // declaration
void foo(StructureName * MagneticModels[]);
int main()
{
foo(&MagneticModels);
}
StructureName * MagneticModels[1] = { ... }; // definition
当然,这个漏洞的适用性非常有限。在C中,以下代码是合法的(其中
T
是您的结构名称或其他名称):
但是,C++中的函数原型是非法的(更不用说调用)。
如果你试图编写C代码,那么确保你正在调用C编译器,而不是C++编译器。 如果你试图写C++,但调用这个函数(它的头必须用C编写,并且函数也可以在C中实现),那么你需要编写一个存根函数,它有C++中的合法原型。 例如:
// stub.h
void foo2( T **ptr ); // preferably use "extern C" guards around this
及
将通过传递第一个元素的地址而不是整个数组的地址来调用此存根:
T * MagneticModels[1];
foo2( MagneticModels );
你能提供任何实际的代码片段而不是提示吗?你使用的是哪种语言?(C和C++在某些情况下对不完整数组类型有不同的规则)。非常感谢!我认为C总是与C++兼容的。学习新东西很好。现在它起作用了:)
// stub.c
#include "foo.h" // the troublesome function
void foo2( T **ptr )
{
foo( (T *(*)[]) ptr );
}
T * MagneticModels[1];
foo2( MagneticModels );