以下三个命令有什么区别?
假设我们声明一个包含10个元素的数组arr。
int arr[10];
现在命令是:
命令1:
memset(arr,0,sizeof(arr));
和 命令2:
memset(arr,0,10*sizeof(int));
这两个命令在程序中运行顺利,但以下命令不是
命令3:
memset(arr,0,10);
那么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)
。