C++ 如何在缓冲区末尾添加0x00

C++ 如何在缓冲区末尾添加0x00,c++,C++,我有一段代码如下: char* buffer = new char[12]; memcpy(newbuffer, bytes, 10); //bytes is const void * 现在,我希望我没有使用的最后2个字节应该附加0000 我怎样才能做到这一点呢?简单到: buffer[10]=buffer[11]=0; 如果是较长的范围,您可以使用memset或std::fill。简单如下: buffer[10]=buffer[11]=0; 如果是较长的范围,您可以使用memset或st

我有一段代码如下:

char* buffer = new char[12];
memcpy(newbuffer, bytes, 10); //bytes is const void *
现在,我希望我没有使用的最后2个字节应该附加0000

我怎样才能做到这一点呢?

简单到:

buffer[10]=buffer[11]=0;
如果是较长的范围,您可以使用memset或std::fill。

简单如下:

buffer[10]=buffer[11]=0;

如果是较长的范围,您可以使用memset或std::fill。

您可以直接分配它们:

buffer[10] = 0;
buffer[11] = 0;

如果愿意,也可以将其放入循环中。

您可以直接分配它们:

buffer[10] = 0;
buffer[11] = 0;
如果愿意,也可以将其放入循环中。

只需将其设置为0即可

buffer[10] = buffer[11] = 0;
只需将它们设置为0

buffer[10] = buffer[11] = 0;

使用memset

memset(buffer + 10, 0, 2);
使用memset

memset(buffer + 10, 0, 2);

如果您需要为两个以上的元素执行此操作:

memset( & buffer[10], 0, 2 );
更通用:

// sets the next n elements of your array of type T
// pointed by pointer to 0.
memset( pointer, 0, n*sizeof(T) );

对于两个元素,许多人已经建议的简单解决方案可能会更清晰、更快。

如果您需要针对两个以上的元素执行此操作:

memset( & buffer[10], 0, 2 );
更通用:

// sets the next n elements of your array of type T
// pointed by pointer to 0.
memset( pointer, 0, n*sizeof(T) );

对于两个元素,许多人已经提出的简单解决方案可能会更清晰、更快。

另一种方法是在写入缓冲区之前,先用零填充缓冲区,使用memset或std::fill。

另一种方法是先用零填充缓冲区,使用memset或std::fill,写入缓冲区之前。

在调用memcpy之前初始化整个缓冲区,并完成以下操作:

char* buffer = new char[12];
memset(buffer, 0, 12);
memcpy(buffer, bytes, 10);

在调用memcpy之前初始化整个缓冲区,并完成以下操作:

char* buffer = new char[12];
memset(buffer, 0, 12);
memcpy(buffer, bytes, 10);

因为你使用C++,你应该避开手动内存管理,使用你可以使用的标准库设施,比如STD::vector。在C++中,手动管理内存几乎是不可能的,除了在低层库代码中选择很少的情况之外,它完全是必须的。 鉴于:

const char* bytes; 
std::size_t n_bytes = 10; 
以下任何一项都有效:

std::vector<char> buffer(bytes, bytes + n_bytes);
buffer.push_back(0); // null-terminate the buffer
或:

或:

哪个性能最好取决于编译器如何实现std::vector。在实践中,除非您以相对较高的频率创建和销毁缓冲区,否则您不会注意到相当大的性能差异。这里介绍的三种解决方案中的第一种,乍一看是最干净、最容易理解的


通过使用std::vector,您不必担心自己会释放内存,也不必担心在异常导致函数提前返回时正确销毁动态分配的对象。此外,标准库容器的良好实现,如VisualC++提供的C++库,提供了调试版本中的运行时检查,帮助您发现常见错误,比如一个错误或迭代器失效错误。您应该避免手动内存管理,使用标准的库工具,如std::vector。在C++中,手动管理内存几乎是不可能的,除了在低层库代码中选择很少的情况之外,它完全是必须的。 鉴于:

const char* bytes; 
std::size_t n_bytes = 10; 
以下任何一项都有效:

std::vector<char> buffer(bytes, bytes + n_bytes);
buffer.push_back(0); // null-terminate the buffer
或:

或:

哪个性能最好取决于编译器如何实现std::vector。在实践中,除非您以相对较高的频率创建和销毁缓冲区,否则您不会注意到相当大的性能差异。这里介绍的三种解决方案中的第一种,乍一看是最干净、最容易理解的


通过使用std::vector,您不必担心自己会释放内存,也不必担心在异常导致函数提前返回时正确销毁动态分配的对象。此外,标准库容器(如VisualC++提供的)的良好实现,在调试版本中提供运行时检查,帮助您发现常见错误,如一个错误或迭代器失效错误。

为什么不使用STD::vector或STD::string?为什么不使用STD::vector或STD::String?+ 1:因为他在编译时声明数组的大小,所以他可以以几乎相同的方式使用std::array/boost::array/std::tr1::array。+1:另外,因为他在编译时声明数组的大小,所以他可以以几乎相同的方式使用std::array/boost::array/std::tr1::array。