c++ - memset() 的意外行为

标签 c++ cstring

我正在用所有元素中的 99 初始化数组

#include<iostream>
#include<cstring>
int main(){
    int a[10];
    memset(a,99,10);
    std::cout<<a[0]<<std::endl;
    return 0;
}

但我得到的输出是出乎意料的。

输出:-

1667457891

这个memset函数异常行为背后的原因是什么。

最佳答案

首先,memset 采用字节大小,而不是数组元素的数量,因为它不知道每个元素有多大。您需要使用 sizeof 来获取数组的字节大小,并将其提供给 memset:

memset(a, 99, sizeof(a));

但是,在 C++ 中,更喜欢 std::fill,因为它是类型安全的、更灵活的,有时效率更高:

std::fill(begin(a), end(a), 99);

第二个也是更紧迫的问题是 memsetfill 在这个实例中有不同的行为,所以你必须决定你想要哪个:memset 将每个 byte 设置为 99,而 fill 将设置每个 element (在您的情况下为每个 int)到 99。如果您想要一个包含等于 99 的整数的数组,请使用 fill,如我所展示的那样。如果您希望每个字节设置为 99,我建议将 int* 转换为 char* 并在其上使用 fill 而不是 memset,但 memset 也适用。

关于c++ - memset() 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13102356/

相关文章:

c++ - token 解析器语义操作

模板参数中的 C++ 智能指针

c++ - char* 值在分配期间被损坏

c - 多字符串连接

c++ - 如何在 dev c++ 上运行客户端服务器程序?

c++ - 为什么在指定 -rdc=true 时 cuda 代码运行得更慢

c++ - 使用 argv[1] 作为文件名问题

c - 如何从包含动态创建字符串数组的结构中释放内存?

c++ - 我应该将项目的哪些文件放入 repo

c++ - 使用带有 MFC CString 的 boost 字符串算法来检查字符串的结尾