我有另一个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")
如果我的理论不正确,谁能告诉我这里到底发生了什么?
这两个电话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)
代替.