使用内存集函数的各种方式之间的区别

Difference between various ways of using memset function

本文关键字:方式 之间 区别 内存 集函数      更新时间:2023-10-16

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

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

int arr[10];

现在的命令是:

命令 1:

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

和 命令 2:

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

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

命令 3:

memset(arr,0,10);

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

情况 #1:sizeof(arr)返回 10 * sizeof(int)

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

案例 #3:10返回 10

一个 int 占用多个字节(通常在 32 位上为 4)。因此,如果您为第三种情况40,它可能会起作用。但从来没有真正这样做过。

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

memset(arr,0,10);

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

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

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

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).