各种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函数使用方式的区别的主要内容,如果未能解决你的问题,请参考以下文章