2009-08-10 65 views
0

我应该在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数据包给我不同的结果(第一个是正确的,因为我想,第二个不是),就像我做错了什么wi日小端/大端符号,我猜...

,为什么在类的构造函数我不能修改[私人]“的char *缓冲区”是这样的:

buffer[0] = 0xe4; 

? (这是行不通的,退出没有任何追溯错误)

(如果它能够决定的事情,我使用的加密++和Boost库)

先感谢您的任何help_

回答

6

你的第一个代码示例大致等同于:

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

这里的两个不同之处是:

  • 的BUF fer是空终止的
  • 缓冲区是不可修改的。试图修改它可能会崩溃。

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

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

+0

好的。问题在于“静态”关键字。 非常感谢。 – 2009-08-12 07:39:16

+0

不要只是在不知道它意味着什么的情况下抛弃“静态” - 如果您有这个类,递归或多个线程的多个实例,最终可能会导致数据损坏,因为您将共享相同的缓冲区在不止一个地方。我会给出更好的建议,但是对于您的计划,您没有具体的建议。 – bdonlan 2009-08-12 13:39:11

2

""文字具有隐式NUL终止,除非被显式数组长度限制(在本例中不受此约束)。

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

2

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