c++ - 为什么 memset() 错误地初始化 int?

标签 c++ c memset

为什么下面程序的输出是84215045

int grid[110];
int main()
{
    memset(grid, 5, 100 * sizeof(int));
    printf("%d", grid[0]);
    return 0;
}

最佳答案

memset 将目标缓冲区的每个 byte 设置为指定值。在您的系统上,一个 int 是四个字节,在调用 memset 之后每个字节是 5。因此,grid[0] 的值为 0x05050505(十六进制),即十进制的 84215045

一些平台为 memset 提供替代 API,将更宽的模式写入目标缓冲区;例如,在 OS X 或 iOS 上,您可以使用:

int pattern = 5;
memset_pattern4(grid, &pattern, sizeof grid);

获得您似乎期望的行为。你的目标是什么平台?

在 C++ 中,您应该只使用 std::fill_n:

std::fill_n(grid, 100, 5);

关于c++ - 为什么 memset() 错误地初始化 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7100529/

相关文章:

c++ - std::array 中的编译时间范围检查

c++ - 模板类成员方法内的自动 lambda : does not name a type

c - printf 在调用通过引用传递变量的函数时发出警告

c - 为什么 "memset(arr, -1, sizeof(arr)/sizeof(int))"不将整数数组清除为 -1?

jquery - jQuery 中的 C++ memset() 等价物

c++ - Lua、C++ 和穷人的子类化

c++ - 在 Windows 上使用 C/C++ 检查 VPN 的连接性

c - {{a,b,c},{d,e,f}} 和 {{g,h,i},{j,k,i},{l,m,n}} 卷积的 ListCorrelate vDSP 等价物

在基于 UNIX 的系统上使用 C 和 C++ 清除屏幕?

c - 是什么导致了这个 memset() 中的段错误?