Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何初始化一个变量,它是指向结构指针数组的指针?_C++_C_Pointers - Fatal编程技术网

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