【问题标题】:Passing the Number of Elements in an Array to Function?将数组中的元素数传递给函数?
【发布时间】: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 中存在访问冲突。更进一步,我在运行时看到了 datasData 的值:

  1. data 指向具有正确值的 22 字节字符数组(显然)
  2. sData 指向一个以第一个字节为空终止的 char 数组,只包含一个值 (0)

我很清楚编译器不知道为sData 分配22 个字节,只是因为我没有为它指定任何长度。所以我的问题是:

如何指定sData 的长度,以便参数 过了不会提前结束吗?

如果我对这个问题有误,请纠正我并进一步解释。提前感谢您的帮助!


编辑:

我知道\0data 中的第一个字节和更多字节)是一个空终止符,会提前结束数组。我要问的是 如何 避免这种情况。我的理解是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 字符串的事情,例如你的调试器。没有理由认为这是您的错误,除非您自己的代码决定/选择以相同的方式解释数组。

标签: c++ c arrays c-strings


【解决方案1】:

不会发生 sData 的分配,它只是指向您的数组。它在调试器中显示为空,因为它将 char* 显示为字符串,并且当第一个字节 '/0' 出现时字符串结束。这并不意味着 sData 没有正确的数据。写入 sData[0]。 sData[1] 等,在您的调试器中查看正确的值。

【讨论】:

  • 解释调试器输出,但不解释崩溃。
  • @LightnessRacesinOrbit 他没有提供足够的信息来了解坠机事件。通过排除他认为是原因的这一点,他有望诊断出自己的崩溃。
  • 是的,但这是评论而不是答案。还有其他几个人发表的评论! :)
  • @LightnessRacesinOrbit 公平地说,我认为这是在任何人评论之前写的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-11-24
相关资源
最近更新 更多