使用memset函数的各种方式之间的差异

时间:2014-01-18 20:22:54

标签: c++ arrays memory sizeof memset

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

假设我们声明一个包含10个元素的数组arr。

int arr[10];

现在命令是:

命令1:

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

和 命令2:

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

这两个命令在程序中运行顺利,但以下命令不是

命令3:

memset(arr,0,10);

那么3个命令之间的区别是什么?

3 个答案:

答案 0 :(得分:5)

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

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

案例#3:10返回10

int占用多个字节(通常在32位上为4)。因此,如果你对案例3做了40,它可能会有效。但实际上从未这样做过。

答案 1 :(得分:2)

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

memset(arr,0,10);

但是arr并不是10个字节。 (事实上​​,它不是)你需要知道arr中有多少个字节,而不是有多少元素。

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

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

答案 2 :(得分:1)

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

memset(arr,0,10*sizeof(int))arr填入10*sizeof(int)个零,再次填充为字节。在这种情况下,这又是正确的大小。这比第一个更脆弱。如果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)