什么是初始化 unsigned char*
的正确方法?我目前正在这样做:
unsigned char* tempBuffer;
tempBuffer = "";
我应该使用 memset(tempBuffer, 0, sizeof(tempBuffer));
吗?
为了“正确地”初始化指针(如您的示例中的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);
free()
释放它。 - ereOn。在调用
getDigest()之前,我必须声明一个
unsigned char*`。 - BrianNULL
是一个好习惯。我可能会在一行中完成所有操作:unsigned char* digest = sha1ObjectPtr->getDigest();
- Karl Bielefeldtchar
结果不正确。然而,当我执行(unsigned char*)malloc(21);
时,我得到了正确的结果。 - Brian由于它是一个指针,您需要首先将其初始化为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.优先使用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))
如果计划是作为缓冲区,并且您希望稍后将其移动以指向某些内容,则应将其初始化为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 );
这取决于您想要实现什么(例如,您是否需要修改字符串)。有关更多详细信息,请参见http://c-faq.com/charstring/index.html。
请注意,如果声明指向字符串字面值的指针,则应为const
,即:
const unsigned char *tempBuffer = "";
const
,那么以后就无法添加了... 它应该总是 const
吗? - BriantempBuffer
指向一个实际的内存缓冲区,而不是一个字面字符串。 - KevenKunsigned char *tempBuffer = "I am a beautiful banana"
,那么它是const的。否则,如果我稍后在程序中添加字节,那么非const就可以了,对吗? - Brian初始化指针的正确方式取决于1)它的作用域和2)它的预期用途。
如果指针被声明为静态的,和/或者在文件作用域中声明,那么ISO C/C++保证它被初始化为NULL。编程风格纯粹主义者仍然会将其设置为NULL,以使其风格与局部作用域变量一致,但从理论上讲这样做是没有意义的。
至于要将其初始化为什么...将其设置为NULL。不要将其设置为指向“”,因为这将分配一个包含空终止符的静态虚拟字节,一旦指针被分配给其他内容,它就会成为一个微小的静态内存泄漏。
有人可能会问为什么你需要首先将其初始化为任何值。在使用之前只需将其设置为有效值即可。如果您担心在给指针赋予有效值之前使用它,您应该获得一个合适的静态分析器来查找这些简单的错误。即使大多数编译器也会捕捉到这个错误并给出警告。