C Struct属性的默认值

时间:2016-12-23 20:16:21

标签: c

我正在尝试为链表实现推送功能,但以下程序导致了分段错误。我想知道几件事:结构属性的默认值是什么?我似乎必须手动将head->next的值设置为NULL。那么head->next的默认值是什么?

我相信程序中断的原因是因为在推送功能中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;
    }
}

1 个答案:

答案 0 :(得分:6)

  

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

C标准将struct字段称为成员,而非属性

C中struct的成员在三种情况下定义了值:

  • 在静态/全局内存中分配struct时,或
  • 通过初始化程序或
  • 提供成员值时
  • 使用内存分配例程将内存清零。

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

在您的情况下,struct会在malloc的动态内存中分配calloc。这意味着必须明确指定其成员。

如果您从malloc切换到struct,则Node *n = calloc(1, sizeof(Node)); 的内存将被清零:

public String removePasswordFromJsonString(String jsonString){

  // Handle null input
  if (jsonString == null) {
    return null;
  }

  // Replace all password values with empty strings
  return jsonString.replaceAll(
      "(\\n?\\s*\"password\"\\s?:\\s?\")[^\\n\"]*(\",?\\n?)", "$1$2");

}