1
typedef struct{

      int key;
      int priority;
}array_node;


array_node *newNode(int key, int priority) {

     array_node *g;
     g = (array_node *)calloc(1,sizeof(array_node));

     if (NULL==g) {
        fprintf(stderr, "Out of mem!\n");
        return (NULL);
     }

     g->key=key;
     g->priority=priority;
     return g;
}

int main(){

    array_node *newNode;
    newNode->key = 5;
    newNode->priority = 1000;

    printf("%d\n",newNode->key);
}

大家好!我需要了解为什么在编译程序时会出现分段错误。似乎一切都很好,但我不知道错误来自哪里。

我只是在实现一个节点结构。

4

3 回答 3

3

首先:

g = (array_node *)malloc(sizeof(array_node *));

它应该是

g = malloc(sizeof(array_node));

在第一个中,您为 array_node 指针分配内存,但您需要 array_node 对象。当你后来尝试做

g->key=key;
g->priority=priority;

您引用的是内存中的某个位置,而不是对象组件。当然,您不必将 malloc 返回值强制转换为 (array_node*),因为在 C 中您不必从 void* 强制转换。在这里你可以阅读它。

另一个更严重的错误,因为那是您的段错误的来源:

array_node *newNode;
newNode->key = 5;
newNode->priority = 1000;

应该像另一位响应者指出的那样:

array_node* node = newNode(5, 1000);

在您的版本中,您只需创建一个指向 array_node 对象的指针(只是一个内存地址),因此您不能引用键或优先级,因为它们不存在。


现在我看到您将 malloc 更改为

array_node *g;
g = (array_node *)calloc(1,sizeof(array_node));

当你想为数组分配内存时,你应该使用 Calloc。在您的情况下,您应该使用 malloc,您可以在上面找到它。

于 2012-07-19T16:40:20.387 回答
3

尝试这个

// use these headers
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
  int key;
  int priority;
}array_node;

array_node *newNode(int key, int priority) {

  // sizeof(array_node), not sizeof(array_node) == sizeof(void*) == 4 or 8 typically
  array_node *g = malloc(sizeof(array_node));

  if (NULL==g) {
     fprintf(stderr, "Out of mem!\n");
     return (NULL);
  }

  g->key=key;
  g->priority=priority;
  return g;
}

int main(){
   /// call the function, not just type its name
   array_node* n = newNode(5, 1000);

   printf("Key = %d, Priority = %d\n", n->key, n->priority);

   return 0;
}

注意右括号,它不是 Python,而是 C。 printf() 不会为您考虑。它只会打印 n 的地址。

于 2012-07-19T16:40:53.330 回答
2

查看 main():

array_node *newNode;

这个指针有一个未定义的值。正确的是:

array_node *node = newNode(5, 1000);
于 2012-07-19T16:40:42.020 回答