Выделение памяти под структуры
Всем привет. У меня есть структура
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 шт):
Ну смотрите, что вы делаете:
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? Вот и получаете неприятности...
По крайней мере при попытке воспроизведения вашей программы я получил их именно в этой строке, а не там, куда показываете вы.