我有一个非托管C库的托管C ++包装类。我遇到了一个问题,我从托管C ++类发送的指针似乎没有指向非托管C代码库方法使用的相同内存位置。
LOCAL_STATIC_LIBRARIES
dataPointer可能没有指向C库使用的相同地址吗?或者也许我需要使用某种编组方法,或者我可能缺少的其他陷阱?
答案 0 :(得分:1)
如果指针未被管理,给定您显示的代码,C
函数无法对未初始化的指针执行任何操作,除了:
您正在按值传递指针,并且按值传递意味着该函数将使用传递的参数的本地副本,因此您在函数返回时看不到任何更改。该函数无法设置指针,并使这些更改以现在的方式反映给调用者。
由于我们讨论的是C
接口,您应该将C
接口更改为:
void getDataFromNonmanagedCLibrary(MyNonManagedType**);
传递指向指针的指针。由于我们想要更改传递给函数的值并将其反射回调用者,因此会传递指向该值的指针。由于该值恰好是一个指针,我们传递一个指向指针的指针。
然后重写getDataFromNonmanagedCLibrary
以通过解除引用来初始化指针:
void getDataFromNonmanagedCLibrary(MyNonManagedType** ptr)
{
*ptr = <the_address_you_expected_on_return>;
}
然后在客户端:
MyNonManagedType* dataPointer;
getDataFromNonmanagedCLibrary(&dataPointer);
请注意,指针的地址是传递的,与您希望函数通过传递变量的地址来更改非指针变量没有区别。