memset()的意外行为
Unexpected behaviour of memset()
我正在初始化所有元素中的99数组
#include<iostream>
#include<cstring>
int main(){
int a[10];
memset(a,99,10);
std::cout<<a[0]<<std::endl;
return 0;
}
但我得到的结果出乎意料。
输出:-
1667457891
这个内存集函数异常行为背后的原因是什么。
首先,memset
取的是以字节为单位的大小,而不是数组的元素数量,因为它不知道每个元素有多大。您需要使用sizeof
来获取数组的以字节为单元的大小,并将其提供给memset
:
memset(a, 99, sizeof(a));
然而,在C++中,更喜欢std::fill
,因为它是类型安全的,更灵活,有时也更高效:
std::fill(begin(a), end(a), 99);
第二个也是更紧迫的问题是,在这种情况下,memset
和fill
有不同的行为,所以你必须决定你想要哪一个:memset
将把每个字节设置为99,而fill
将把每个元素(在你的情况下是每个int
)设置为99。如果你想要一个满是等于99的整数的数组,请使用我展示的fill
。如果你希望每个字节都设置为99,我建议将int*
强制转换为char*
,并在其上使用fill
而不是memset
,但memset
也适用。
问题是memset
将每个字节设置为99
,因此第一个int
为0x63636363,等于1667457891。请改用std::fill
。
相关文章:
- 在C++中对T*类型执行std::move的意外行为
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- C++中的memset函数工作不正常
- 使用vscode调试时,GDB意外退出
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- C++中意外的多头值
- vector.size() 在比较中意外工作
- 使用 malloc() 时出现意外大小
- 多线程程序中出现意外的内存泄漏
- 为什么static_cast基础类型的枚举类int8_t获得意外值?
- 字符串比较中的意外输出
- memset()的意外行为