【发布时间】:2019-05-25 18:17:31
【问题描述】:
我正在使用Marshal.AllocHGlobal c# 方法为 IntPtr 分配内存,然后复制 byte[] 的包含:
byte[] clientIpAddr = System.Text.Encoding.ASCII.GetBytes("127.0.0.1")
IntPtr client_ipAddr_p = IntPtr.Zero;
ipAddress_p = Marshal.AllocHGlobal(clientIpAddr.Length);
Marshal.Copy(clientIpAddr, 0, ipAddress_p, clientIpAddr.Length);
然后我将指针传递给接收我的变量的 C++ 外部库,如下所示:
int open_socket(char *clientIpAddr_p)
{
<open a socket>
}
根据AllocHGlobal 的定义,它最终可以保留比预期更多的内存(我可以保证,因为我现在正在忍受它)。问题是我需要我的IntPtr 具有我所要求的大小,因为我需要精确的 IP 以便之后打开套接字。
是否有更好的方法来分配外部内存以确保char * 拥有我的正确 IP?
【问题讨论】:
-
不,不...
char*指针 clientIpAddr_p 指向的 C/C++ 文本需要以零结尾。以便 open_socket 函数可以正确确定字符串的长度。因此,您需要分配一个大小为 atleast 字符串长度 + 1 的缓冲区(可以分配更多),紧跟在字符串字符之后的 byte/char 是\0byte/字符。 (C/C++ 中的指针不携带有关它指向的数据的长度/大小的任何信息。)我想花一些时间学习 C/C++ 教程涵盖指针和零终止字符串将是最好的时间跨度> -
那么这就是我的问题的答案,谢谢!
-
我不知道您是如何从 .NET 调用 C/C++ 代码的。如果您可以在 P/Invoking 来自 .NET 的本机 C/C++ 函数时直接将字符串作为参数传递,那么 .NET 编组器可以自动将 .NET 字符串转换为指向零的指针。终止的 C 字符串,省去了为 C/C++ 函数手动分配和填充字符/字符串缓冲区的麻烦,从而使您的代码既简单又可能更健壮...
-
@elgonzo 为什么不发布答案而不是 cmets?
标签: c# c++ memory-management