2016-12-23 93 views
0

我试图为一个链表实现一个推送函数,但是下面的程序导致了一个分段错误。我想知道几件事情:什么是结构的属性的默认值?看来我必须手动将head->next的值设置为NULL。那么head->next的默认值是多少呢?C Struct的属性的默认值

我相信,程序停止的原因是因为在推功能,head->next != NULL所以它然后执行行head = head->next,这使我想知道的head->next值是什么,如果它不是NULL,为什么这会导致分段故障?

typedef struct Node { 
    struct Node *next; 
    int data; 
} Node; 

void push(Node *head, int data); 

int main() 
{ 
    struct Node *head = malloc(sizeof(Node)); 
    head->data = 1; 

    // Works when I uncomment this line 
    // head->next = NULL; 

    push(head, 2); 
    return 0; 
} 

/* Insert */ 
void push(Node *head, int data) { 
    while (head != NULL) { 
     if (head->next == NULL) { 
      Node *n = malloc(sizeof(Node)); 
      n->data = data; 
      head->next = n; 
      break; 
     } 
     head = head->next; 
    } 
} 
+0

两个downvotes并没有意见?为了帮助你 - 你很可能因为缺乏研究努力而陷入低估(可能是?),因为正如下面的答案所述,“在分配之前阅读它们是未定义的行为,”这是相对常见的知识,因为任何C教程,尤其是链接列表上的教程,可能会告诉你。 –

回答

6

什么是一个结构的属性的默认值?

C标准是指struct领域成员,不属性

  • 当用户要通过初始化供给构件值分配struct S IN静态/全局存储器,或
  • ,或
  • :在C struct小号

    议员在三种情况下定义的值

  • 您使用内存分配例程将内存清零。

在所有其他情况下,第一次使用之前struct成员必须分配;在分配之前阅读它们是未定义的行为。

在你的情况,struct在动态内存分配malloc。这意味着其成员必须明确分配。

如果从malloc切换到callocstruct的记忆将被清零你:

Node *n = calloc(1, sizeof(Node)); 
+3

关于术语的注意事项:C标准引用'struct' _members_,而不是_properties_。使用标准术语可能是一个好主意,因为不常见的术语通常会引起混淆(C语境中的'struct'的属性可以是限定符或说明符)。 – Olaf

+1

@Olaf没错。我一直使用OP的术语来让答案更容易理解,但我认为纠正术语也不失为一个好主意。感谢您的评论! – dasblinkenlight