#include <stdio.h>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
bool* library_pad;
vector<unsigned char> my_pad, my_pad2;
int main()
{
int N = 10000;
library_pad = new bool[N];
my_pad.resize(N);
my_pad2.resize(N);
int sum0 = 0;
for (int i = 0; i < N; i++) {
my_pad[i] = i % 256;
sum0 += my_pad[i];
}
cout << sum0 << "\n";
memcpy(library_pad, reinterpret_cast<bool*>(my_pad.data()), N * sizeof(bool));
int sum1 = 0, weird_count = 0;
for (int i = 0; i < N; i++) {
sum1 += library_pad[i];
if (library_pad[i] != 0 && library_pad[i] != 1) weird_count++;
}
cout << sum1 << ", weird_count = " << weird_count << "\n";
memcpy(my_pad2.data(), reinterpret_cast<char*>(library_pad), N * sizeof(char));
int sum2 = 0;
for (int i = 0; i < N; i++) sum2 += my_pad2[i];
cout << sum2 << "\n";
return 0;
}
// stdout:
// 1273080
// 1273080, weird_count = 0
// 1273080
我正在使用一个库,该库需要将数据放入内存缓冲区
library_pad
,数据类型为bool*
.
我有一些返回
std::vector<char>
的函数,但保证它们只包含0/1。我不想使用 vector<bool>
因为它是一个假的 std::vector
(它的元素不表示为内存中的连续字节数组)。
如果你
memcpy
喜欢在代码中,布尔值既不能是0
也不能是1
。正确的解决方案是使用 for
循环而不是 memcpy
.
这是有意的还是未定义的行为?
编辑: 如果打印出
library_pad
的值,它的值在 0->255 上。但是输出中有weird_count == 0
,这意味着编译器完全删除了语句
if (library_pad[i] != 0 && library_pad[i] != 1) weird_count++;
可能是因为它假设
bool
总是 0
或 1
,所以该语句应该总是 false
.