使用内存集函数的各种方式之间的区别
Difference between various ways of using memset function
以下三个命令有什么区别?
假设我们声明一个包含 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)
.
- 在c代码之间共享数据的最佳方式
- C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- 将函数作为参数传递的两种方式之间的区别
- 如何在Qt WebChannel中以独立于平台的方式在HTML/Javascript和C++之间进行通信?
- 如何以包装的方式初始化布局,从而减少布局之间的空间
- C++配置之间切换的最佳方式
- 这些在C 中初始化C数组的方式之间有区别吗?
- Qt中数据类(模型)和视图/控制器类之间的数据通信的正确方式是什么
- 消除有符号和无符号整数表达式之间比较的优雅方式
- 实时在语言之间流水线传输或以其他方式传输数据
- 找到组合对之间共享元素的最佳方式
- 使用内存集函数的各种方式之间的区别
- 这将是在将函数分配给变量或一次又一次地调用函数之间使用函数结果的最佳方式
- 成员类之间的通信的正确方式是什么?
- iOS和Android之间共享代码的最佳方式
- 逗号(,)在条件部分中两个表达式之间的for循环中的工作方式
- JScript 和 Windows 服务之间的通信方式
- 尝试在Qt中连接隐藏信号的两种方式之间做出决定
- 在堆栈上声明对象的两种方式之间的差异
- 在这两种包含相同标头的方式之间,编译器中是否发生了不同的事情