2011-02-02 88 views
12

什麼是初始化unsigned char*的正確方法?我目前做這個:正確的方式來初始化無符號字符*

unsigned char* tempBuffer; 
tempBuffer = ""; 

或者我應該使用memset(tempBuffer, 0, sizeof(tempBuffer));

+2

變量名稱錯誤。它不是緩衝區,只是一個指針。用unsigned char tempBuffer創建緩衝區[666]; – 2011-02-02 15:07:58

回答

8

第二種方法會留下一個空指針: 如果您希望分配一個字符串,這可以做如下。請注意,這裏沒有爲緩衝區聲明任何空間,您將聲明指針指向必須在別處創建的緩衝區。如果將其初始化爲"",則會使指針指向一個靜態緩衝區,其中只有一個字節爲空終止符。如果你想要一個緩衝區,你可以在稍後寫入字符,使用Fred的數組建議或類似malloc

2

這取決於你想達到什麼(例如,你是否想修改字符串)。見例如http://c-faq.com/charstring/index.html瞭解更多詳情。

請注意,如果您聲明一個指向字符串常量,它應該是const,即:

const unsigned char *tempBuffer = ""; 
+0

如果我使它成爲`const`,我不能在以後添加它,但是它應該總是`const`? – Brian 2011-02-02 15:03:04

+1

@Brian:如果它指向一個字符串,它應該是const。 – 2011-02-02 15:04:01

+1

@Brian:如果你打算「稍後添加它」,你需要將你的`tempBuffer`指向一個真正的內存緩衝區,而不是一個文字字符串。 – KevenK 2011-02-02 15:04:56

5

由於這是一個指針,你要麼要初始化它第一次爲NULL這樣的:

unsigned char* tempBuffer = NULL; 
unsigned char* tempBuffer = 0; 

或分配可變的地址,像這樣:

unsigned char c = 'c'; 

unsigned char* tempBuffer = &c; 

編輯:

unsigned char myString [] = "This is my string"; 
unsigned char* tmpBuffer = &myString[0]; 
1

如果計劃是將它作爲緩衝區,並且您希望稍後將其移至指向某處的位置,則將其初始化爲NULL,直到它指向您想要寫入的某個位置,而不是空字符串。

unsigned char * tempBuffer = NULL; 
std::vector< unsigned char > realBuffer(1024); 
tempBuffer = &realBuffer[0]; // now it really points to writable memory 
memcpy(tempBuffer, someStuff, someSizeThatFits); 
1

答案取決於你使用unsigned char的內容。一個字符是什麼也沒有其他的,但是一個小整數,在所有實現的99%上大小爲8位。

C恰好有一些字符串支持與char匹配,但不限制字符串對char的使用。


初始化指針的正確方法取決於1)其範圍和2)其預期用途。

如果指針被聲明爲靜態的,或者在文件範圍聲明,那麼ISO C/C++會保證它被初始化爲NULL。編程風格純粹主義者仍然會將其設置爲NULL以保持其風格與局部範圍變量一致,但理論上這樣做毫無意義。

至於什麼初始化它...設置爲NULL。不要將它設置爲指向「」,因爲它會分配一個包含空終止符的靜態虛擬字節,只要將指針指定給別的東西,這個靜態內存泄漏就會變得很小。

有人可能會質疑爲什麼你需要首先將它初始化爲任何東西。在使用之前將其設置爲有效的。如果你在給它一個有效值之前擔心使用指針,你應該得到一個合適的靜態分析器來找到這樣簡單的錯誤。即使大多數編譯器也會捕獲這個錯誤並給你一個警告。

13

要「正確」初始化一個指針(unsigned char *在你的例子),你需要做的只是一個簡單的

unsigned char *tempBuffer = NULL; 

如果您想初始化的unsigned char秒的陣列,您可以執行下列操作事情:

unsigned char *tempBuffer = new unsigned char[1024](); 
// and do not forget to delete it later 
delete[] tempBuffer; 

unsigned char tempBuffer[1024] = {}; 

我會還建議看看std::vector<unsigned char>,你可以初始化這樣的:

std::vector<unsigned char> tempBuffer(1024, 0); 
3

如果你知道緩衝區在編譯時的大小:

unsigned char buffer[SIZE] = {0}; 

爲了在分配的動態分配的緩衝區(緩衝區運行時或在):

1.Prefer的new操作者:

unsigned char * buffer = 0; // Pointer to a buffer, buffer not allocated. 
buffer = new unsigned char [runtime_size]; 

2.多的解決方案,「初始化」,或者簡單填入值:

std::fill(buffer, buffer + runtime_size, 0); // Prefer to use STL 
memset(buffer, 0, runtime_size); 
for (i = 0; i < runtime_size; ++i) *buffer++ = 0; // Using a loop 

3,C語言方面則提供了分配和初始化一個電話。
然而,該函數不調用對象的構造函數:

buffer = calloc(runtime_size, sizeof(unsigned char)) 

注意,這也將緩衝區中的所有位爲零;你在初始值中沒有選擇。