struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
我填写此结构,然后使用值。在下一次迭代中,我想将所有字段重置为0
或null
我开始再使用它之前。
我怎样才能做到这一点?我可以使用,memset
还是必须仔细检查所有成员,然后逐个进行?
Answers:
使用初始值定义该结构的const静态实例,然后在每次要重置它时将其分配给变量即可。
例如:
static const struct x EmptyStruct;
在这里,我依靠静态初始化来设置我的初始值,但是如果您想要不同的初始值,则可以使用结构初始化器。
然后,每次循环,您都可以编写:
myStructVariable = EmptyStruct;
memset
使我感到肮脏。我宁愿让编译器尽可能地担心内存布局。严格来说,这种用法memset
是不可移植的,但是实际上,如果您在任何重要的地方编译代码,我都会感到惊讶。因此,如果您愿意,可以安全地使用memset。
当您使用现代C(C99)时,执行此操作的方法是使用复合文字。
a = (const struct x){ 0 };
这有点类似于David的解决方案,只是您不必担心声明一个空结构或是否声明它static
。如果const
像我一样使用,则编译器可以在适当的情况下自由地在只读存储中静态分配复合文字。
{ 0 }
作为默认的初始化程序。关闭该警告,这是虚假的错误警报。
使用标准C规范进行结构初始化是比上面更好的方法:
struct StructType structVar = {0};
这里都是零(永远)。
{}
在C ++中使用。gcc开发人员似乎不确定C ++是否应该支持,{0}
而我本人也不熟悉标准的那部分。
{0}
or 太多了可移植性问题{}
。不知道C和C ++标准是否在此问题上明确并同步,但是显然编译器不是。
struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
在C语言中,将struct
使用的内存清零是一种常见的习惯用法memset
:
struct x myStruct;
memset(&myStruct, 0, sizeof(myStruct));
从技术上讲,我不认为这是可移植的,因为它假定NULL
一台机器上的指针由整数值0表示,但是它被广泛使用,因为在大多数机器上都是这种情况。
如果从C转到C ++,请注意不要在每个对象上都使用此技术。C ++仅对没有成员函数且没有继承的对象将此合法化。
如果您具有符合C99的编译器,则可以使用
mystruct = (struct x){0};
否则,您应该做David Heffernan写的事情,即声明:
struct x empty = {0};
并在循环中:
mystruct = empty;
您可以使用memset
struct的大小:
struct x x_instance;
memset (&x_instance, 0, sizeof(x_instance));
memset
是一种选择,但使用时,必须确保使该内存写入正是大小作为第三个参数一样的,这就是为什么它是更好地指实际物体的大小,而不是类型的大小你知道它目前是。IOW memset (&x_instance, 0, sizeof(x_instance));
是更好的选择。顺便说一句:(void*)
在C ++中,cast也是多余的。
输入图像的描述在这里从gnu11拿一个惊喜!
typedef struct {
uint8_t messType;
uint8_t ax; //axis
uint32_t position;
uint32_t velocity;
}TgotoData;
TgotoData tmpData = { 0 };
没有什么是零。
memset
如果我只想将所有内容重置为0
?