2014-11-09 1 views
-4

Okay поэтому у меня этот вопрос:указатель на структуру доступа нарушение пишущего расположение

Unhandled exception at 0x00261A46 in CompGeometry.exe: 0xC0000005: Access violation writing location 0xCDCDCDED. 
First-chance exception at 0x00261A46 in CompGeometry.exe: 0xC0000005: Access violation writing location 0xCDCDCDED. 

Это происходит в этой строке кода с помощью отладчика:

edges.tail->next->a = newEdge->a; 

Это весь код для этого конкретного часть:

/* non-empty list -- add it */ 
    if (edges.head != NULL) 
    { 
     printf("1 %d, %d\n", newEdge->a.x, newEdge->a.y); 
     printf("2 %d, %d\n", newEdge->b.x, newEdge->b.y); 

     //edges.tail->next = new hull::EDGE; 

     edges.tail->next->a = newEdge->a; 
     edges.tail->next->b = newEdge->b; 
     newEdge->next = NULL; 
     edges.tail->a.x = newEdge->a.x; 
     edges.tail->a.y = newEdge->a.y; 
     edges.tail->b.x = newEdge->b.x; 
     edges.tail->b.y = newEdge->b.y; 
    } 
    /* empty list -- 1st item */ 
    else 
    { 
     edges.head = newEdge; 
     edges.tail = newEdge; 
     newEdge->next = NULL; 
    } 

Это мой край структура и мои ребра структура:

typedef struct line { 
    VERTEX a; 
    VERTEX b; 
    struct line *next; 
} EDGE; 

struct edges { 
    int size; 
    EDGE* head; 
    EDGE* tail; 
}; 

//all edges of the hull 
struct edges edges; 

Итак, я пытаюсь добавить EDGE к массиву EDGES с именем «edge».

Пожалуйста, помогите!

+1

Вы не проверяете, не являются ли 'edge.tail' и' edge.tail-> next' не 'NULL'. – wimh

ответ

1

Проблема с вашим

edges.tail->next 

Вы должны убедиться, что если

edges.tail 

и

edges.tail->next 

не перед доступом к ней NULL.

+0

Да, но я знаю, что они NULL ... Я пытаюсь добавить новый край ...? – Borovez

+1

Итак, сначала выделите некоторую память ... затем присвойте им значения – ravi

+0

Ну, если вы прочитали мой код, у меня что-то закомментировано ... У меня есть этот edge.tail-> next = new hull :: EDGE; который также вызывает ошибку нарушения – Borovez

1

Перед тем, как назначить им, включая хвост и его членов, вам необходимо проверить все переменные и члены.

0xCDCDCD .... - это неинициализированный маркер памяти Microsoft runtime. См. here

+0

Хорошо, если вы читаете мой код, у меня что-то прокомментировано ... У меня есть этот edge.tail-> next = new hull :: EDGE; что также вызывает ошибку нарушения – Borovez

+0

Имеет ли значение «хвост» правильное значение? Вы назначаете edge.tail-> next directy. – DNT

+0

хвост не должен иметь значение .... его пустой список ... Я хочу добавить к нему значение. – Borovez

0

Хорошо, я понял, вы, ребята, были на правильном пути для выделения памяти ... так больно дайте вам точку за это.

мне нужно сделать это, прежде чем я добавить к хвосту и tail-> следующая:

edges.tail = (hull::EDGE*) malloc(sizeof(hull::EDGE)); 
    edges.tail->next = (hull::EDGE*) malloc(sizeof(hull::EDGE)); 

Спасибо.