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