我有一段代码:
char* buffer = new char[12];
memcpy(newbuffer, bytes, 10); //bytes is const void *
现在我希望我未使用的最后2个字节应附加0000
。
我怎样才能做到这一点?
答案 0 :(得分:2)
这很简单:
buffer[10]=buffer[11]=0;
如果距离较远,您可以使用memset
或std::fill
。
答案 1 :(得分:2)
使用memset。
memset(buffer + 10, 0, 2);
答案 2 :(得分:2)
在调用memcpy
并为其完成之前初始化整个缓冲区:
char* buffer = new char[12];
memset(buffer, 0, 12);
memcpy(buffer, bytes, 10);
答案 3 :(得分:1)
您可以直接指定它们:
buffer[10] = 0;
buffer[11] = 0;
如果你愿意,可以把它放在一个循环中。
答案 4 :(得分:1)
将它们设置为0。
buffer[10] = buffer[11] = 0;
答案 5 :(得分:1)
errr ..
buffer[10] = 0;
buffer[11] = 0;
答案 6 :(得分:1)
如果您需要为两个以上的元素做到这一点:
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) );
对于两个元素,许多人已经建议的简单解决方案可能会更清晰,更快。
答案 7 :(得分:1)
由于您使用的是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<char> buffer(n_bytes + 1);
std::copy(bytes, bytes + n_bytes, buffer.begin());
或:
std::vector<char> buffer;
buffer.reserve(n_bytes + 1);
std::copy(bytes, bytes + n_bytes, std::back_inserter(buffer));
buffer.push_back(0);
哪种表现最佳取决于编译器如何实现std::vector
。实际上,除非您以相对较高的频率创建和销毁缓冲区,否则您将不会注意到相当大的性能差异。这里介绍的三个解决方案中的第一个是最清晰,最容易理解的乍一看。
通过使用std::vector
,您不必担心自己释放内存,并且当异常导致函数提前返回时,您无需担心正确销毁动态分配的对象。此外,标准库容器(如Visual C ++提供的容器)的良好实现提供了调试版本中的运行时检查,可帮助您查找常见错误,如逐个错误或迭代器失效错误。
答案 8 :(得分:0)
另一种方法是在写入之前先使用memset
或std::fill
用零填充缓冲区。