C 使用结构的节点

C 使用结构的节点,c,struct,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

大家好!我需要了解为什么每次编译程序时都会出现分段错误。看起来一切都很好,但我不知道错误是从哪里来的

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

首先:

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);
}
应该是

g = (array_node *)malloc(sizeof(array_node *));
在第一种方法中,为数组\节点指针分配内存,但需要数组\节点对象。当你后来想做什么的时候

g = malloc(sizeof(array_node));
您引用的是内存中的某个地方,但不是对象组件。当然,您需要将不必要的强制转换malloc返回值转换为(array_node*),因为在C中,您不必从void*强制转换。你可以读到它

另一个错误甚至更严重,因为这就是seg故障的来源:

g->key=key;
g->priority=priority;
正如另一位回应者所指出的:

array_node *newNode;
newNode->key = 5;
newNode->priority = 1000;
在您的版本中,您只需创建一个指向array_node对象的指针(只是一个指向内存的地址),因此不能引用键或优先级,因为它们不存在


现在我看到你把malloc改成了

array_node* node = newNode(5, 1000);
要为数组分配内存时应使用的Calloc。在您的情况下,您应该使用malloc,您可以在上面找到它。

首先:

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);
}
应该是

g = (array_node *)malloc(sizeof(array_node *));
在第一种方法中,为数组\节点指针分配内存,但需要数组\节点对象。当你后来想做什么的时候

g = malloc(sizeof(array_node));
您引用的是内存中的某个地方,但不是对象组件。当然,您需要将不必要的强制转换malloc返回值转换为(array_node*),因为在C中,您不必从void*强制转换。你可以读到它

另一个错误甚至更严重,因为这就是seg故障的来源:

g->key=key;
g->priority=priority;
正如另一位回应者所指出的:

array_node *newNode;
newNode->key = 5;
newNode->priority = 1000;
在您的版本中,您只需创建一个指向array_node对象的指针(只是一个指向内存的地址),因此不能引用键或优先级,因为它们不存在


现在我看到你把malloc改成了

array_node* node = newNode(5, 1000);
要为数组分配内存时应使用的Calloc。在您的情况下,应该使用malloc,您可以在上面找到它。

查看main()

此指针有一个未定义的值。正确答案是:

array_node *newNode;
查看main():

此指针有一个未定义的值。正确答案是:

array_node *newNode;
试试这个

array_node *node = newNode(5, 1000);
//使用这些标题
#包括
#包括
#包括
类型定义结构{
int键;
int优先级;
}数组_节点;
数组_node*newNode(int键,int优先级){
//sizeof(数组节点),而不是sizeof(数组节点)==sizeof(void*)==4或8
array_node*g=malloc(sizeof(array_node));
if(NULL==g){
fprintf(标准,“内存外!\n”);
返回(空);
}
g->key=key;
g->优先级=优先级;
返回g;
}
int main(){
///调用函数,而不仅仅是键入其名称
数组_node*n=newNode(51000);
printf(“Key=%d,Priority=%d\n”,n->Key,n->Priority);
返回0;
}
注意右括号,它不是Python,而是C。printf()不会为您费心思考。它只会打印n的地址。

试试这个

array_node *node = newNode(5, 1000);
//使用这些标题
#包括
#包括
#包括
类型定义结构{
int键;
int优先级;
}数组_节点;
数组_node*newNode(int键,int优先级){
//sizeof(数组节点),而不是sizeof(数组节点)==sizeof(void*)==4或8
array_node*g=malloc(sizeof(array_node));
if(NULL==g){
fprintf(标准,“内存外!\n”);
返回(空);
}
g->key=key;
g->优先级=优先级;
返回g;
}
int main(){
///调用函数,而不仅仅是键入其名称
数组_node*n=newNode(51000);
printf(“Key=%d,Priority=%d\n”,n->Key,n->Priority);
返回0;
}


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

问题是什么?我想
malloc(sizeof(array\u node*))
应该改成
malloc(sizeof(array\u node))
。这就像真人秀:“Type-a-question”仅供参考,我还在编辑这篇文章,所以还没有任何问题。@ms.sakura:下次请在发帖前完整地写下问题。问题是什么?我想
malloc(sizeof(array_node*))
应该改成
malloc(sizeof(array_node))
。这就像真人秀:“Type-a-question”仅供参考,我还在编辑这篇文章,所以还没有任何问题。@ms.sakura:下次请在发帖前完整地写下问题。如果这是C,你不应该把那个错误的东西扔掉。但是如果我不把它扔掉,我就得到这个错误:MyHeHop.C: 78:错误:无效的从“空虚*”转换为“ArayHythNo.*”,这意味着你用C++编写,而不是C。除非你使用C++编译器。无论哪种方式都能纠正你的MALLC,所有的事情都应该很好。@ CasChimeFuy尝试,这个不一致性已经被编辑成这个答案:),这实际上只是掩盖了一个问题,即MalOC创建一个大小为ArayyHythPosithPoTr.@ MsSakula的内存块,如果你在C++中编码,你最好使用“新”而不是“CalLoc”,否则,你应该使用MALOC为这些结构分配空间。如果你不投,我也会评论,如果我不投它,我会得到这个错误:MyOHeApp.C:78:错误:无效的从“空虚*”转换为“ArayHythNo.*”,这意味着你用C++编写,而不是C。除非你使用C++编译器。无论哪种方式都能纠正你的MALLC,所有的事情都应该很好。@ CasChimeFuy尝试,这个不一致性已经被编辑成这个答案:),这实际上只是掩盖了一个问题,即MalOC创建一个大小为ArayyHythPosithPoTr.@ MsSakula的内存块,如果你在C++中编码,你最好使用“新”而不是“CalLoc”,否则,您应该使用malloc为这样的结构分配空间;仅进行此更改不会修复代码。这并不是对此答案进行向下投票而不是对另一个答案进行向上投票的一个很好的理由。我得到了以下错误:my_heaps.c:在函数“int main()”中:my_heaps.c:96:erro