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);
}
大家好!我需要深入了解为什么每当我编译程序时都会出现分段错误。似乎一切都很好,但我不知道错误来自哪里。
我只是实现节点结构。
答案 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);