各种memset函数使用方式的区别

Posted

技术标签:

【中文标题】各种memset函数使用方式的区别【英文标题】:Difference between various ways of using memset function 【发布时间】:2014-01-18 20:22:54 【问题描述】:

以下三个命令有什么区别?

假设我们声明一个数组 arr 有 10 个元素。

int arr[10];

现在的命令是:

命令 1:

memset(arr,0,sizeof(arr));

和 命令 2:

memset(arr,0,10*sizeof(int));

这两个命令在一个程序中运行流畅,但下面的命令不是

命令 3:

memset(arr,0,10);

那么这3个命令有什么区别呢?

【问题讨论】:

您确定您使用的是 C++ 而不是 C 吗? 因为 int 的大小通常不是 1 字节。 【参考方案1】:

案例#1:sizeof(arr) 返回 10 * sizeof(int)

案例#2:sizeof(int) * 10 返回相同的东西

案例 #3:10 返回 10

一个 int 占用超过一个字节(通常是 4 个 32 位)。因此,如果您为案例三执行40,它可能会起作用。但永远不要真正这样做。

【讨论】:

【参考方案2】:

memset 的第三个参数是要填充多少 字节。所以在这里你告诉memset 设置10 个字节:

memset(arr,0,10);

arr 不一定是 10 个字节。 (其实不是)你需要知道arr中有多少bytes,而不是多少元素。

int 的大小不保证为 1 个字节。在大多数现代 PC 类型的硬件上,它将是 4 个字节。

您不应该假设任何特定数据类型的大小,char 除外,它保证为 1 个字节。对于其他所有内容,您必须使用sizeof 确定它的大小(在编译时)。

【讨论】:

【参考方案3】:

memset(arr,0,sizeof(arr))sizeof(arr) 零填充 arr -- 作为字节。 sizeof(arr) 在这种情况下是正确的,但要注意在指针而不是数组上使用这种方法。

memset(arr,0,10*sizeof(int))10*sizeof(int) 零填充arr,同样作为字节。这又是正确的尺寸在这种情况下。这比第一个更脆弱。如果arr不包含10个元素怎么办,如果每个元素的类型不是int怎么办。例如,您发现自己正在溢出并将int arr[10] 更改为long long arr[10]

memset(arr,0,10) 用零填充arr 的前 10 个字节。这显然不是你想要的。

这些都不是很像 C++。使用std::fill 会好得多,它是从<algorithm> 头文件中获得的。例如,std::fill (a, a+10, 0)

【讨论】:

以上是关于各种memset函数使用方式的区别的主要内容,如果未能解决你的问题,请参考以下文章

memset函数

梦开始的地方 —— C语言内存函数memcpy-memmove-memset(使用+模拟实现)

memset函数使用

memset函数使用

使用 memset 设置数组

请说明结构体初始化数据赋值的几种方式