在C++中的结构数组上的memset

gar*_*rry 0 c++ memset

我有另一个memset问题.好像我正在编辑的代码可能有一些问题(或者在不同的文件中没有以相同的方式完成)

A::LRM las[9]; //A and LRM are both structures with BOOLS and INTS
memset(&las, 0, sizeof(las));

typedef Sec SecArray[16];
SecArray rad_array;
memset(rad_array, 0, sizeof(SecArray));
Run Code Online (Sandbox Code Playgroud)

第二个示例似乎是正确的,因为rad_array它与数组中的第一个位置相同.那sizeof(SecArray))会有意义.第一个似乎对我不正确.所有的结构都只是BOOL,INTS没有任何动态.

我在其他关于memset的帖子中的理解是它遵循这种格式.

memset("pointer to object", "what to set it to", "size of object")

如果我的理论不正确,谁能告诉我这里到底发生了什么?

AnT*_*AnT 9

这两个电话memset都是正确的.两者sizeof(las)(或只是sizeof las)sizeof(SecArray)将返回整个数组的大小.

如果你担心第一个论点,那么两个都会起作用.指向整个array(&las)的指针或指向第一个元素的指针(rad_array在此上下文中)将同样适用于memset.

一般来说,在使用方面sizeof,我建议使用第一种方法,因为它与类型无关.一个好的编程习惯是避免在语句中提及类型名称,即尽可能将类型名称限制为声明.

至于第一个参数,在数组的情况下,它是一个偏好的问题,但一般来说,如果你有一个类型的对象,我会说 T

T t;
Run Code Online (Sandbox Code Playgroud)

并且你想用它填充零memset,你通常会这样做

memset(&t, 0, sizeof t);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么数组应该是该规则的异常(特别是如果类型的确切性质隐藏在typedef-name后面).memset(&t, ...无论T是数组类型,结构类型还是任何其他类型,上述操作都将起作用.我不明白为什么一个人应该突然放弃&因为T是数组类型.恰恰相反,我会保持这一点,&以保持代码尽可能与类型无关.

最后,在C++中,在这两种情况下,更好的方法是不使用memset,只是这样做

A::LRM las[9] = {};
SecArray rad_array = {};
Run Code Online (Sandbox Code Playgroud)

代替.