char数组赋值和管理

时间:2009-08-10 14:21:00

标签: c++ char byte

我应该用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;

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

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

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

buffer[0] = 0xe4;

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

(如果可能很重要,我正在使用crypto ++和boost库)

提前感谢任何帮助_

3 个答案:

答案 0 :(得分:6)

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

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

这里的两个不同之处是:

  • 缓冲区以空值终止
  • 缓冲区不可修改。试图修改它可能会崩溃。

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

对于第三个样本,如果它是一个指针,你初始化'buffer'吗?您没有提供足够的信息来真正诊断您的错误 - 完整的类声明和构造函数会有所帮助。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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