我正在编写一个将char数组传递给函数的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
指向具有正确值(显然)sData
指向由第一个字节以空值终止的char数组,仅包含一个值(0)我很清楚,编译器不知道为sData
分配22个字节,只是因为我没有为它指定任何长度。所以我的问题是:
如何指定
sData
的长度以便参数 通过赢得了提前终止?
如果我对这个问题不对,请纠正我并进一步解释。感谢您提前提供任何帮助!
修改
我理解\0
(data
中的第一个字节和更多字节)是一个空终止符,会过早地结束数组。我要问的是如何来避免这种情况。我的理解是,sData
从未给出特定的长度,因此在\0
停止,但我可能错了。
我被要求提供我的sendData函数:
bool sendData(unsigned char* sData, unsigned long sSize)
{
try
{
Send(sData, sSize);
return true;
}
catch (...)
{
return false;
}
}
Send
正在调用另一个模块的函数,但与该问题无关,因为当sData
参数传递给sendData
时,错误会先发生。< / p>
答案 0 :(得分:-1)
不会发生sData的分配,只是指向你的数组。它在调试器中显示为空,因为它将char *显示为字符串,并且当存在'/ 0'(第一个字节)时字符串结束。这并不意味着sData没有正确的数据。写sData [0]。调试器中的sData [1]等,以查看正确的值。