【问题标题】:char array assignment and management字符数组分配和管理
【发布时间】:2009-08-10 14:21:00
【问题描述】:

我应该用 C++ 编写一个库来处理与 kad 网络的连接。 我正在尝试构建一个与 aMule&co 使用的数据包一致的数据包。

而且我真的无法理解这段代码之间的区别:

buffer = "\xe4\x20\x02";

例如,这段代码:

char p_buffer[36];
p_buffer[0] = 0xe4;
p_buffer[1] = 0x20;
p_buffer[2] = 0x02;

buffer = p_buffer;

(buffer是类的私有属性,而p_buffer是局部变量)

用wireshark捕获数据包给了我不同的结果(第一个是我想要的,第二个不是),就像我用小端/大端符号做错了,我猜......

以及为什么在类的构造函数中我不能像这样修改 [private] "char* buffer":

buffer[0] = 0xe4;

? (它不起作用,退出没有任何回溯错误)

(如果重要的话,我正在使用 crypto++ 和 boost 库)

提前感谢您的帮助_

【问题讨论】:

    标签: c++ char byte


    【解决方案1】:

    您的第一个代码示例大致相当于:

    static const char buffer_internal[4] = { 0xe4, 0x20, 0x02, 0x00 };
    buffer = buffer_internal;
    

    这里的两个区别是:

    • 缓冲区以空值结尾
    • 缓冲区不可修改。尝试修改它可能会崩溃。

    您的第二个示例分配了一个 36 字节的可修改缓冲区。然而,当缓冲区超出范围时,它也会被丢弃 - 在这里要非常小心,它在被释放后不会被使用。

    至于第三个示例,如果是指针,您是否初始化了“缓冲区”?您没有提供足够的信息来真正诊断您的错误 - 完整的类声明和构造函数会有所帮助。

    【讨论】:

    • 不要在不知道它意味着什么的情况下就扔进“静态”——如果你有这个类的多个实例、递归或多个线程,你最终可能会导致数据损坏,因为你将在多个地方共享同一个缓冲区。我会提供更好的建议,但您对您的计划过于笼统,无法提供任何具体建议。
    【解决方案2】:

    "" 文字具有隐式 NUL 终止,除非受到显式数组长度的限制(在这种情况下不是)。

    同样在第二种情况下,由于p_buffer 是一个局部变量,即分配在堆栈上的自动变量,它的内容不会初始化为零或任何值,但会包含底层堆栈内存中的任何垃圾。

    【讨论】:

      【解决方案3】:

      只是一个建议 - 如果您已经在使用 Boost,请查看 boost::array 以简化固定长度缓冲区管理,并查看 boost::shared_array 以处理可变长度缓冲区。

      【讨论】:

        猜你喜欢
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 2013-04-15
        • 2022-01-16
        相关资源
        最近更新 更多