C++ 传递字符串数组给函数参数

C++ 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。

对于传入字符串数组同理,所以如果在函数中对传入的字符串数组进行改变,函数外的字符串数组也会同时改变

举个简单的例子:

void change(char s[]){
	s[1] = 'a';
}

int main()
{
	char s[] = "hhh";
	change(s);
	cout << s << endl;

	return 0;
}

输出:hah

### 如何通过互操作封送从 C++ 传递字符串数组到 C# 当涉及到跨语言的数据交换时,特别是像 C# 和 C++ 这样的不同编程环境之间的交互,理解如何正确配置数据结构以及使用适当的方法来处理这些转换至关重要。 对于字符串数组传递,在 C++ 中定义一个函数返回 `SAFEARRAY` 或者指针指向字符数组是非常常见的做法。为了使这个过程顺利工作,需要确保在 C# 端能够识别并适当地解包来自未托管代码的数据[^1]。 #### 定义 C++ 函数 假设有一个简单的 C++ DLL 提供了一个导出函数用于传输字符串列表: ```cpp // C++ extern "C" __declspec(dllexport) HRESULT GetStringArray(SAFEARRAY **ppsaStrings); ``` 此函数创建一个新的安全数组并将它分配给传入的安全数组指针参数。每个元素都是 BSTR 类型(基本串),这是 COM 接口中常用的宽字节串表示形式。 #### 配置 C# 方法签名 为了让 C# 正确解释上述 C++ 函数的结果,应该这样声明 P/Invoke 导入语句: ```csharp [DllImport("YourCppDll.dll", CharSet = CharSet.Unicode)] public static extern int GetStringArray(out IntPtr psaStrings); // 返回类型调整为匹配 HRESULT 的整数 ``` 注意这里选择了 `CharSet.Unicode` 来指定字符集编码方式,并且将输出参数设置为 `IntPtr` 而不是直接映射成 `object[]` 或其他更具体的类型。这是因为我们需要手动控制内存管理和对象实例化的过程[^2]。 #### 解析 SAFEARRAY 并获取字符串集合 一旦获得了包含字符串的安全数组指针,就可以利用 .NET Framework 提供的帮助类来进行进一步的操作: ```csharp using System; using System.Runtime.InteropServices; ... unsafe public static string[] ConvertSafeArrayToStringArray(IntPtr psa) { if (psa == IntPtr.Zero) throw new ArgumentNullException(nameof(psa)); try { var safeArrayPtr = (System.Array)(Marshal.GetObjectForIUnknown(psa)); List<string> result = new(); foreach(var item in safeArrayPtr){ result.Add(Marshal.PtrToStringUni((IntPtr)item)); } return result.ToArray(); } finally { Marshal.ReleaseComObject(safeArrayPtr); } } ``` 这段代码片段展示了怎样把由 C++ 创建的安全数组转化为可管理的对象序列,同时释放不再使用的资源以防止潜在的泄漏问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值