如何初始化一个变量,该变量是指向结构的指针数组的指针
How to initialize a variable which is a pointer to array of pointers to structure?
我需要从第三方源调用一个函数。该函数需要以下类型的参数:
StructureName *(*parameterName)[]
在一个例子中,它被定义为指针数组:
StructureName * MagneticModels[1]
它被传递给带有"&"运算符的函数。不幸的是,在Visual Studio 2013中,它无法编译:
Error C2664: (...) cannot convert argument (...) from 'StructureName *(*)[1]' to 'StructureName *(*)[]'
因此,为了编译它,我添加了一个新变量,并将其传递给函数:
StructureName *(*variableName)[];
现在它编译时没有错误,但后来我得到一个运行时错误,即使用了"variableName"而没有初始化。
我尝试了很多方法来初始化它,但我不是C++开发人员,所以这是一场真正的磨难,一天后我没有任何进展。因此,如果有任何帮助或建议,我将不胜感激。
在C中,以下代码是合法的(其中T
是您的结构名称或其他名称):
void foo( T *(*ptr)[] )
{ }
int main()
{
T *arr[1];
foo( &arr );
}
然而,函数原型在C++中是非法的(更不用说调用了)。
如果您正在尝试编写C代码,请确保您调用的是C编译器,而不是C++编译器。
如果您试图编写C++,但调用此函数(其标头必须用C编写,并且该函数可能也是用C实现的),那么您将需要编写一个在C++中具有合法原型的存根函数。
例如:
// stub.h
void foo2( T **ptr ); // preferably use "extern C" guards around this
和
// stub.c
#include "foo.h" // the troublesome function
void foo2( T **ptr )
{
foo( (T *(*)[]) ptr );
}
这个存根将通过传递第一个元素的地址而不是整个数组的地址来调用:
T * MagneticModels[1];
foo2( MagneticModels );
如果函数需要StructureName *(*parameterName)[]
参数,那么将指向StructureName * MagneticModels[1]
数组的指针传递给该函数的唯一方法是使用带有显式强制转换的&
运算符
foo((StructureName *(*)[]) &MagneticModels);
(通过对数组类型使用typedef
,可以使其可读性更强)。
另一个漏洞是基于这样一个事实,即数组可以用未知大小声明,然后用特定大小定义。只要编译器在调用时只知道"未知大小"声明,它将允许您在不进行强制转换的情况下传递它
extern StructureName * MagneticModels[]; // declaration
void foo(StructureName * MagneticModels[]);
int main()
{
foo(&MagneticModels);
}
StructureName * MagneticModels[1] = { ... }; // definition
当然,这个漏洞的适用性非常有限。
- 指针变量在 cout 函数中不起作用
- 如何将指针变量作为引用参数传递?
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 我试图了解在异或操作后指针变量正在更改
- 调用带有指针对象错误的指针变量
- 如何在 cuda 中将结构的指针变量从主机复制到设备
- 非指针变量和类成员上的新放置
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- 全局外部指针变量在 DLL 中不可见
- 如何访问在 c++ 中在类内声明的结构类型指针变量?
- C++ 中指针变量的内存释放
- 使用指针变量打印特定的数组变量
- 如何使用构造函数初始化内存地址(指针变量)?
- 如何释放为指针变量本身提供的内存?
- 如果地址已知,如何获取指针变量的名称
- 如何处理参数中的基类和指针变量
- 指针变量 在数组中定位零
- 隐式指针变量,在自动定义中具有另一个指针变量
- 为什么可以将Char指针变量初始化为字符串,而INT指针变量不能初始化到整数数组
- 错误 C4703 可能未初始化的局部指针变量'y'使用