2011-02-16 57 views
1

的末尾添加0×00我有一段代碼爲:如何在緩衝

char* buffer = new char[12]; 
memcpy(newbuffer, bytes, 10); //bytes is const void * 

現在,我想我還沒有使用應該0000附加的最後2個字節。

我該如何做到這一點?

+3

爲什麼不使用`std :: vector `或`std :: string`? – GManNickG 2011-02-16 18:27:25

回答

2

容易,因爲這:

buffer[10]=buffer[11]=0; 

如果是你也可以使用memsetstd::fill更遠的射程。

1

您只需直接將它們分配:

buffer[10] = 0; 
buffer[11] = 0; 

或者把它放在一個循環,如果你喜歡。

1

只需將它們設置爲0。

buffer[10] = buffer[11] = 0; 
1

errr ..

buffer[10] = 0; 
buffer[11] = 0; 
2

使用memset的。

memset(buffer + 10, 0, 2); 
1

如果你需要做的是多隻有兩個元素:

memset(& buffer[10], 0, 2); 

更通用:

// sets the next n elements of your array of type T 
// pointed by pointer to 0. 
memset(pointer, 0, n*sizeof(T)); 

對於簡單的解決方案已經被提出只有兩個元素許多人可能會更清晰,更快。

0

另一種方法是在寫入之前先用零填充緩衝區,使用memsetstd::fill

2

調用memcpy之前,初始化整個緩衝區和它爲你做:

char* buffer = new char[12]; 
memset(buffer, 0, 12); 
memcpy(buffer, bytes, 10); 
+0

+1。我會比我寫的更傾向於這樣做。 – 2011-02-16 22:25:58

1

由於您使用C++,你應該避開手動內存管理和使用標準庫設施是提供給你,就像std::vector 。使用C++手動正確管理內存幾乎是不可能的,除了少數情況下(例如在低級庫代碼中),它是完全必要的。

考慮:

const char* bytes; 
std::size_t n_bytes = 10; 

以下任何方式將工作:

std::vector<char> buffer(bytes, bytes + n_bytes); 
buffer.push_back(0); // null-terminate the buffer 

或:

std::vector<char> buffer(n_bytes + 1); 
std::copy(bytes, bytes + n_bytes, buffer.begin()); 

或:

std::vector<char> buffer; 
buffer.reserve(n_bytes + 1); 
std::copy(bytes, bytes + n_bytes, std::back_inserter(buffer)); 
buffer.push_back(0); 

哪個性能最好取決於編譯器如何實現std::vector。在實踐中,除非您以較高的頻率創建和銷燬緩衝區,否則您不會注意到相當大的性能差異。這裏介紹的三個解決方案中的第一個是乍一看最清楚和最容易理解的。

通過使用std::vector,您不必擔心自己釋放內存,並且在異常導致函數返回提前時無需擔心正確銷燬動態分配的對象。此外,標準庫容器(如Visual C++提供的容器)的良好實現提供了調試構建中的運行時檢查,可幫助您查找常見錯誤,如逐個錯誤或迭代器失效錯誤。

+0

+1:另外,由於他在編譯時聲明瞭數組的大小,所以他可以使用`std :: array` /`boost :: array` /`std :: tr1 :: array`幾乎相同方式。 – 2011-02-17 12:30:02