C++-c++ bool类型的 memset疑惑

C++-c++ bool类型的 memset疑惑

夜无邪 发布于 2017-06-10 字数 275 浏览 1231 回复 3
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
using namespace std;

int main()
{
bool c[30];
memset(c,-1,sizeof(c));
cout<<c[0]<<endl;
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜柠檬 2017-10-03 3 楼

因为memset并不感知c的实际类型,它只根据sizeof的结果把指定的内存填充指定的值,在你的例子里,就是sizeof(c)个0xFF。

进而,当你用c[0]这样去读取这块内存的时候,读出来的值的类型取决于匹配到的最佳的std::cout中<<操作符的参数,按照结果来看,应该是unsigned int,所以就输出255了。如果你想让cout输出true或者false,你可以这样:

std::cout<<std::boolalpha<<c[0]<<std::endl;

晚风撩人 2017-08-02 2 楼

并不是memset的问题, 而是cout的问题。
这是bool类型的匹配调用 _Myt& __CLR_OR_THIS_CALL operator<<(_Bool _Val)
可以跟踪一下他的实现。

另外:
c++ bool类型非0即为true, 虽然你的调试工具可以显示true或false,你可以看看你定义的变量的内存内容。

bool c = 20;
if (c){

int e = 10;

}

汇编码如下
movzx eax,byte ptr [ebp-15h]
test eax,eax
je 003F1EBD

偏爱自由 2017-07-30 1 楼

1:memset字节操作,将C[0]填充为-1,二进制11111111;cout将bool型强制类型转换为unsigned char来输出显示为255. 这样的代码意义不大,加个boolalpha显示为true/false会比较好。
2:memset(c,-1,sizeof(c));memset(c,1,sizeof(c));不要这样使用memset,考虑一下memset的字节操作特性就明白为什么了。
如果真有这种需求,可以考虑自己实现类memset功能,显示的指明操作意图:
// 相当于memset
void VAMemset8(void *dst, uint8 value, size_t count_bytes);
// 每16位作为一个单位赋予value数值
void VAMemset16(void *dst, uint16 value, size_t count_bytes);
// 每32位作为一个单位赋予value数值
void VAMemset32(void *dst, uint32 value, size_t count_bytes);
等等。