正确初始化无符号字符的方法*
初始化unsigned char*
的正确方法是什么? 我目前正在这样做:
unsigned char* tempBuffer; tempBuffer = "";
或者我应该使用memset(tempBuffer, 0, sizeof(tempBuffer));
?
第二种方法将为您留下空指针。 请注意,这里没有为缓冲区声明任何空间,而是声明指向必须在别处创建的缓冲区的指针 。 如果将其初始化为""
,则会使指针指向一个只有一个字节的静态缓冲区 – 空终止符。 如果你想要一个缓冲区,你可以在以后写字符,使用Fred的数组建议或类似malloc
。
要“正确”初始化指针(如示例中的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
,你可以像这样初始化:
std::vector tempBuffer(1024, 0);
因为它是一个指针,你要么首先将它初始化为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];
如果在编译时知道缓冲区的大小:
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))
注意,这也将缓冲区中的所有位设置为零; 你没有得到初始值的选择。
这取决于你想要实现的目标(例如,你是否想要修改字符串)。 有关详细信息,请参阅http://c-faq.com/charstring/index.html 。
请注意,如果您声明一个指向字符串文字的指针,它应该是const
,即:
const unsigned char *tempBuffer = "";
如果计划是将其作为缓冲区并且您希望稍后将其移动以指向某个东西,则将其初始化为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 );
答案取决于你使用unsigned char的内容。 char只是一个小整数,在99%的实现中大小为8位。
C恰好有一些字符串支持,它很适合char,但这并不限制char对字符串的使用。
初始化指针的正确方法取决于1)其范围和2)其预期用途。
如果指针被声明为静态和/或在文件范围内声明,则ISO C / C ++保证将其初始化为NULL。 编程样式纯粹主义者仍然会将其设置为NULL以保持其样式与局部范围变量一致,但理论上这样做是没有意义的。
至于将它初始化为…将其设置为NULL。 不要将它设置为指向“”,因为这将分配一个包含空终止的静态虚拟字节,只要指针被分配给其他东西,它就会变成微小的静态内存泄漏。
有人可能会质疑为什么你需要首先将它初始化为任何东西。 在使用之前将其设置为有效的东西。 如果你担心在给它一个有效值之前使用指针,你应该得到一个适当的静态分析器来找到这样的简单错误。 甚至大多数编译器都会捕获该错误并给你一个警告。