使用C ++中从C库返回的指针

时间:2009-05-31 22:16:28

标签: c++

我使用的是用C开发的库(特别是:HTK)。我对源进行了一些修改,并尝试从函数中获取指针(到链表的开头)。 不要过多细节;说我有一个名为OutType的结构。在我的C ++代码中,我声明: OutType * Out ;并将其传递给某个函数 LName(.....,OutType * Out) 现在,在C库中,LName接受参数Out,并调用名为SaveH的函数,其中Out是返回值( Out = SaveH(...)),在SaveH中,Out是malloc'ed as OutType returnOut =(OutType *)malloc(1,sizeof(OutType)); 据我所知,Out完全是malloc'ed,在LName函数中我可以得到分配的内存区域的地址。但是,当我返回到我的C ++代码,我调用LName并传递Out作为参数时,该参数始终为0作为地址。 如果我将所有内容保持不变,只需更改SaveH以使Out不是返回值,而是将参数更改为 SaveH(....,OutType * Out),并在传递之前在C ++代码中分配该值一切都好。 这是正常的吗?使用C ++代码在C库中分配指针有问题吗? 感谢

2 个答案:

答案 0 :(得分:7)

您正在传递指针的副本,这就是为什么在C ++代码中看不到C库中的更改的原因。

由于您已经在修改库,因此您应该让C函数使用指向的指针。

LName(....., OutType** Out)

*Out=SaveH(...);

现在您将传递C ++指针的地址,因此您的C代码将修改相同的原始指针。

答案 1 :(得分:2)

如果你有一个功能:

void Foo( int * p ) {
   p = malloc( sizeof(int) );
}

然后当你打电话时:

int * x;
Foo( x );

x的值将保持不变,因为会获取指针的副本。你需要一个指向指针的指针:

void Foo( int ** p ) {
   *p = malloc( sizeof(int) );
}

然后:

int * x;
Foo( & x );

如果这不是您的问题,请发布一些实际代码,说明您的要求。