使用Structs的节点

时间:2012-07-19 16:34:54

标签: c struct

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);
}

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

我只是实现节点结构。

3 个答案:

答案 0 :(得分: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 *转换。 Here你可以阅读它。

另一个错误甚至更严重,因为那是你的seg错误来自:

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,您可以在上面找到它。

答案 1 :(得分: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的地址。

答案 2 :(得分:2)

查看main():

array_node *newNode;

此指针具有未定义的值。正确的是:

array_node *node = newNode(5, 1000);