如何初始化一个变量,该变量是指向结构的指针数组的指针

How to initialize a variable which is a pointer to array of pointers to structure?

本文关键字:指针 变量 结构 初始化 数组 一个      更新时间:2023-10-16

我需要从第三方源调用一个函数。该函数需要以下类型的参数:

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

当然,这个漏洞的适用性非常有限。