我正在编写一个 DLL,它将字符数组传递给函数。我在这里定义了包含 22 个元素的 char 数组:
unsigned char data[22] = { 0x00, 0x0A, 0x00, 0x09, 0x70, 0x00, 0x72, 0x00,
0x6F, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00,
0x79, 0x00 };
现在,我尝试将此数组传递给声明为的函数:
bool sendData(unsigned char* sData, unsigned long sSize);
有了这些参数:
sendData(data, 22);
此代码可以编译,但在调用此函数时会使程序崩溃。在调试时仔细观察,我可以发现函数 sendData
中存在访问冲突。进一步观察,我在运行时看到了 data
和 sData
的值:
data
指向具有正确值的 22 字节字符数组(显然)sData
指向一个以第一个字节以 null 结尾的 char 数组,仅包含一个值 (0)
我很清楚,编译器不知道为 sData
分配 22 个字节,只是因为我没有为其指定任何长度。所以我的问题是:
How do I specify the length of the
sData
so that the argument passed won't terminate early?
如果我对这个问题的理解有误,请纠正我并进一步解释。感谢您提前提供的任何帮助!
<小时/>编辑:
我知道 \0
(data
中的第一个字节和更多字节)是一个空终止符,会提前结束数组。我要问的是如何避免这种情况。我的理解是 sData
从未给出特定长度,因此停止在 \0
上,但我可能是错的。
我被要求提供我的 sendData 函数:
bool sendData(unsigned char* sData, unsigned long sSize)
{
try
{
Send(sData, sSize);
return true;
}
catch (...)
{
return false;
}
}
Send
正在从另一个模块调用函数,但与该问题无关,因为在将 sData
参数传递给 时,错误事先发生发送数据
。
最佳答案
不会发生 sData 的分配,它只是指向您的数组。它在调试器中显示为空,因为它将 char* 显示为字符串,并且当存在第一个字节“/0”时字符串结束。这并不意味着 sData 没有正确的数据。写入 sData[0]。 sData[1] 等,在调试器中查看正确的值。
关于c++ - 将数组中的元素数量传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30603982/