这段代码如何工作而没有任何错误
How do this code work without any errors?
我编写了这段代码,将数组设置为0
int arr[4];
memset(arr, 0, sizeof (arr));
非常简单,但是代码如何工作而没有任何错误,即使sizeof(arr)
= 16(4数组大小* 4为int)和我声明数组时使用的大小为4,memset
如何将16位设置为零,数组i作为参数传递的大小为4?
我使用memset(arr, 0, sizeof(arr)/sizeof(*arr));
来获得数组的实际大小,结果是准确的,它给了我4
,但上面的代码如何正确工作?
memset
设置16字节(不是位)为0。这是正确的,因为数组的大小是16字节,正如您正确声明的那样(4个整数x 4个整数)。sizeof
知道数组中元素的数量和每个元素的大小。正如您在文档中看到的,memset
的第三个参数接受字节数,而不是元素数。http://www.cplusplus.com/reference/cstring/memset/
但是要小心使用sizeof()
,当你传递数组为int x[]
或int* x
时。例如,下面的代码段将不会做您期望的事情:
void foo(int arr[]) {
auto s = sizeof(arr); // be careful! this won't do what you expect! it will return the size of pointer to array, not the size of the array itself
...
}
int a[10];
foo(a);
第三个参数是字节数。也就是4*4=16。
memset
实际上第一个解决方案是正确的。
memset
函数将要设置为零的字节数作为第三个参数。
全国矿工工会:要设置的字节数
sizeof
返回表达式占用的字节数。
在你的例子中,sizeof(arr) = 16
恰好是memset
函数请求的字节数。
你的第二个解决方案:
memset(arr, 0, sizeof(arr)/sizeof(*arr)); // Note that: sizeof(arr)/sizeof(*arr) == 16 / 4 (generally) == 4 bytes
将只将前4个字节设置为0,即数组的第一个整数。因此,如果您的意图是将数组的每个元素设置为0,那么该解决方案是错误的。
相关文章:
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误
- Antlr cpp 运行时 任何错误的指针转换?
- 我可以使用 try catch 语句来捕获任何错误而不是具体错误吗?
- 为什么 C++ 中的分号在插入代码开头时不显示任何错误?
- 如何修复任何错误
- 为什么<<低;和 cout<<v.begin;单独给出错误,但 cout <<(lower.begin());没有给出任何错误,并使代码易于编译
- 我是否需要处理以下代码中的任何错误情况?
- 我的代码在构建时没有任何错误,但无法正常工作
- 由于错误,c ++代码无法在Visual Studios上运行,但不显示任何错误
- ROS2 COLCON构建未在Windows中显示任何错误消息
- 如何调试 gRPC 服务器崩溃而没有任何错误
- 尝试使用类,但未打印任何内容.不会生成任何错误.我错过了什么吗?
- 代码没有任何错误,但什么也不在命令提示中
- GTK图像突然不会刷新任何错误或警告
- STL 中是否有任何错误代码异常
- 用“ strcpy”在2D数组中删除(字符)的一行(字符)时是否存在任何错误
- Oracle ODBC 插入失败,没有任何错误诊断
- 检查输入的文件是否有任何错误
- 带有绝对路径的LoadLibrary返回不正确的HMODULE,没有任何错误