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

时间:2015-03-18 23:03:10

标签: c++ c pointers

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

StructureName *(*parameterName)[]

在一个例子中,它被定义为指针数组:

StructureName * MagneticModels[1]

通过“&”传递给函数运营商。不幸的是,在Visual Studio 2013中无法编译:

  

Error C2664: (...) cannot convert argument (...) from 'StructureName *(*)[1]' to 'StructureName *(*)[]'

为了让它编译,我添加了一个新变量并将其传递给函数:

StructureName *(*variableName)[];

现在它编译没有错误但是我得到一个运行时错误,“variableName”被使用而没有被初始化。

我尝试了很多方法来初始化它,但我不是一个C ++开发人员,所以这是真正的考验,经过一天我没有得到任何结果。因此,我将不胜感激任何帮助或建议。

2 个答案:

答案 0 :(得分:1)

如果函数需要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

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

答案 1 :(得分:1)

在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 );