为什么没有使用以下代码将结构指针初始化为NULL
代码
#include <stdio.h>
#include <stdlib.h>
struct list_el
{
int val;
struct list_el * right, * left, *parent;
}item_default={0,NULL,NULL,NULL}; //Default values
typedef struct list_el node;
int main(int argc, char const *argv[])
{
node * new_node = (node*) malloc (sizeof(node));
(new_node == NULL) ? printf("0\n") : printf("1\n");
(new_node->parent == NULL) ? printf("0\n") : printf("1\n");
(new_node->right == NULL) ? printf("0\n") : printf("1\n");
(new_node->left == NULL) ? printf("0\n") : printf("1\n");
(new_node->val == 0) ? printf("0\n") : printf("1\n");
return 0;
}
输出
1 1 1 1 0
是否有关于指针初始化语法的问题?
答案 0 :(得分:1)
struct list_el
{
int val;
struct list_el * right, * left, *parent;
}item_default={0,NULL,NULL,NULL}; //Default values
这不符合你的想法。你基本上写了......
typename typedefinition variable = initial_value;
您已声明类型struct list_el
,将其定义为{ int val; struct list_el * right, * left, *parent; }
,声明了该类型的新变量item_default
,并为其指定了值{0,NULL,NULL,NULL}
。< / p>
除了类型定义,这基本上是int foo = 0
。
我们可以通过打印item_default
的部分来测试。
int main(int argc, char const *argv[])
{
printf("%d\n", item_default.val);
printf("%p\n", item_default.right);
printf("%p\n", item_default.left);
printf("%p\n", item_default.parent);
return 0;
}
这些将是0,0x0(即NULL
),0x0,0x0。
不幸的是,C没有类型的默认值。您始终必须初始化它们。使用结构时,这通常意味着编写new
和destroy
函数,因此初始化和清理始终如一。
// Declare the type and typedef in one go.
// I've changed the name from node to Node_t to avoid clashing
// with variable names.
typedef struct node
{
int val;
struct node *right, *left, *parent;
} Node_t;
// Any functions for working with the struct should be prefixed
// with the struct's name for clarity.
Node_t *Node_new() {
Node_t *node = malloc(sizeof(Node_t));
node->val = 0;
node->right = NULL;
node->left = NULL;
node->parent = NULL;
return node;
}
int main() {
Node_t *node = Node_new();
printf("%d\n", node->val);
printf("%p\n", node->right);
// and so on
return 0;
}
请注意,我没有使用calloc
。 calloc
用零填充内存,但是the machine's representation of a null pointer is not necessarily zero。使用NULL
和0
是安全的,编译器可以从上下文进行转换,但calloc
不知道你将如何处理内存的归零。这是一个相对较小的可移植性问题,如今对于嵌入式系统来说可能更成问题。
答案 1 :(得分:0)
Structure是一种数据类型,您不会为数据类型提供默认值。你正在做的就是给一个默认值为3的int。你想要的是给你的结构的一个实例一个默认值,但这在C中是不可能的。
你可以有一个功能来帮助你:
void init_struct(node* nd) {
if (nd != NULL) {
nd->val = 0;
nd->parent = nd->right = nd->left = NULL;
}
}