2011-02-02 87 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)) 

注意,这也将缓冲区中的所有位为零;你在初始值中没有选择。