Выделение памяти под структуры

Всем привет. У меня есть структура

typedef struct _Node {
struct _Node* parent;
struct _Node* left;
struct _Node* right;


unsigned short int mark;
struct _Node* child;
int degree;

unsigned int key;
type* value;
} Node;

Я выделяю память и определяю поля для экземпляра структуры

Node* node = (Node*)malloc(sizeof (Node));
if (node == NULL) exit(1);

node->key = key; //Здесь ошибка
node->value = value;
node->degree = 0;
node->mark = FALSE;
node->parent = NULL;
node->child = NULL;
node->left = node;
node->right = node;

Но при попытке определить поле экземпляра получаю ошибку вида.

Вызвано исключение: нарушение доступа для записи. node было 0xFFFFFFFFAD0955D0.

Как мне решить проблему? Заранее благодарю.

UPD:Меня просили добавить код целиком. Вот он ниже:

#include<math.h>
#define TRUE 1
#define FALSE 0

typedef int type; // Тип хранимых данных

typedef struct _Node {
    struct _Node* parent;
    struct _Node* left;
    struct _Node* right;


    unsigned short int mark;
    struct Node* child;
    int degree;

    unsigned int key;
    type* value; // Я решил использовать typedef, чтобы не хранить 
} Node;          // указатель на void

typedef struct _FibHeap {
    Node* min;
    unsigned int nnodes;
} FibHeap;
void FibHeapAddNodeToRootList(Node* node, Node* h);
FibHeap* FibHeapInsert(FibHeap* heap, unsigned int key, type* value);

int main()
{
    FibHeap* fh = (FibHeap*)malloc(sizeof(FibHeap));

    int val = 0;

    FibHeapInsert(fh, 10, &val);
    FibHeapInsert(fh, 16, &val);
    FibHeapInsert(fh, 18, &val);
    FibHeapInsert(fh, 6, &val);
    FibHeapInsert(fh, 9, &val);
    FibHeapInsert(fh, 26, &val);
    FibHeapInsert(fh, 12, &val);

    return 0;
}

void FibHeapAddNodeToRootList(Node* node, Node* h)
{
    if (h == NULL)  return;
    if (h->left == h) {
        h->left = node;
        h->right = node;
        node->right = h;
        node->left = h;
    }
    else {
        Node* lnode = h->left;
        h->left = node;
        node->right = h;
        node->left = lnode;
        lnode->right = node;
    }
}

FibHeap* FibHeapInsert(FibHeap* heap, unsigned int key, type* value)
{
    Node* node = (Node*)malloc(sizeof (Node));
    if (node == NULL) exit(1);

    node->key = key;
    node->value = value;
    node->degree = 0;
    node->mark = FALSE;
    node->parent = NULL;
    node->child = NULL;
    node->left = node;
    node->right = node;

    Node* min = heap->min;
    FibHeapAddNodeToRootList(node, heap->min);
    if ((heap->min == NULL) || (node->key < heap->min->key))
        heap->min = node;
    heap->nnodes += 1;
    return heap;
}

Ответы (1 шт):

Автор решения: Harry

Ну смотрите, что вы делаете:

FibHeap* fh = (FibHeap*)malloc(sizeof(FibHeap));

Т.е. fh указывает на неинициализированную память, и что там за значения min и nnodes — Дейкстра его знает...

Далее вы вызываете

FibHeapInsert(fh, 10, &val);

а в ней —

Node* min = heap->min;
FibHeapAddNodeToRootList(node, heap->min);

Т.е. передаете опять же неизвестно что под видом heap->min как Node* h...

FibHeapAddNodeToRootList(Node* node, Node* h)
{
    if (h == NULL)  return;   
    if (h->left == h) {

И куда вы обращаетесь как к h->left? Вот и получаете неприятности...

По крайней мере при попытке воспроизведения вашей программы я получил их именно в этой строке, а не там, куда показываете вы.

→ Ссылка