【发布时间】:2015-06-02 18:39:13
【问题描述】:
我正在编写一个将 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指向具有正确值的 22 字节字符数组(显然) -
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 时会提前发生错误。
【问题讨论】:
-
在 sendData 中会发生什么?我认为调试器只是试图将 sData 指针解释为以零结尾的字符串。
-
调试器输出只是将
char*视为C 字符串的调试器。别管它。您的崩溃无关紧要,我们需要一个测试用例来诊断它。 -
您对作为参数传递的 NUL 终止字符串 (
unsigned char*) 的假设是错误的。您必须向我们展示sendData()的完整代码才能在此处获得任何帮助。 -
“我的理解是 sData 从来没有给定一个特定的长度,因此在 \0 处停止,但我可能错了。” 是的,你是。唯一关心数组中
\0的事情是决定/选择将数组解释为 C 字符串的事情,例如你的调试器。没有理由认为这是您的错误,除非您自己的代码决定/选择以相同的方式解释数组。