2009-08-10 50 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用於處理可變長度緩衝區。