在Win32 API编程中,通常使用struct具有多个字段的C s.通常只有其中几个具有有意义的值,而其他所有值都必须归零.这可以通过以下两种方式之一实现:
STRUCT theStruct;
memset( &theStruct, 0, sizeof( STRUCT ) );
Run Code Online (Sandbox Code Playgroud)
要么
STRUCT theStruct = {};
Run Code Online (Sandbox Code Playgroud)
第二个变体看起来更干净 - 它是一个单行,它没有任何可能输错的参数并导致错误被种植.
与第一个变体相比,它有任何缺点吗?使用哪种变体?为什么?
在 C 中,
{0}通用零初始值设定项与 C++ 的通用零初始值设定项等效{}(后者在 C 中无效)。每当您想要一个完整但概念上不透明或实现定义类型的零初始化对象时,就有必要使用它。C 标准库中的经典示例是mbstate_t:Run Code Online (Sandbox Code Playgroud)mbstate_t state = { 0 }; /* correctly zero-initialized */与常见但不可移植的相比:
Run Code Online (Sandbox Code Playgroud)mbstate_t state; memset(&state, 0, sizeof state);
让我感到奇怪的是,后一个版本可能是不可移植的(即使对于实现定义的类型,编译器也必须知道大小)。这里的问题是什么?什么时候是memset(x, 0, sizeof x)不可移植的?
我有以下结构:
struct node {
int data;
struct node *next;
};
struct node *n1 = malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)
我不确定如何将struct指针的所有指针字段初始化为NULL而不导致任何潜在的内存泄漏?