2014-11-09 5 views
-4

좋아 액세스 위반 쓰기 위치를 구조체하기 :포인터

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; 

그래서 '가장자리'라는 EDGES 배열에 EDGE를 추가하려고합니다.

제발 도와주세요!

+1

'edges.tail'과'edges.tail-> next'가'NULL'이 아닌지 확인하지 않습니다. – wimh

답변

1

문제는

edges.tail 

edges.tail->next 

가 액세스하기 전에 NULL이 있는지 경우 확인해야합니다 귀하의

edges.tail->next 

함께.

+0

네,하지만 그들은 NULL이라는 것을 알고 있습니다 ... 나는 새로운 가장자리를 추가하려고합니다 ...? – Borovez

+1

그럼, 먼저 메모리를 할당 한 다음 값을 할당하십시오. – ravi

+0

글쎄, 내 코드를 읽으면 뭔가 주석 처리가되어있다. 나는 this edges.tail-> next = 새로운 선체 :: EDGE; 또한 위반 오류가 발생합니다 – Borovez

1

꼬리와 그 구성원을 포함하여 할당하기 전에 유효성을 검사하려면 모든 변수와 구성원을 테스트해야합니다.

0xCDCDCD ....는 Microsoft 런타임 초기화되지 않은 메모리 표시입니다. here

+0

글쎄 내 코드를 읽으면 뭔가 주석 처리가되어 있습니다 ... 나는이 edge.tail-> next = 새 선체 :: EDGE; 또한 위반 오류가 발생합니다. – Borovez

+0

'꼬리'가 올바른 값을 갖고 있습니까? edges.tail-> next 지시어에 지정합니다. – DNT

+0

꼬리는 값을 가지지 않아야합니다 .... 그것의 빈 목록 ... 나는 그것에 가치를 추가하고 싶습니다. – Borovez

0

알았어. 알아 냈어, 너희들은 메모리를 할당하기위한 올바른 길을 가고 있었다. 그래서 병이 들었다.

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

감사 : 나는 꼬리에 추가 tail-> 다음 전에

나는이 작업을 수행해야합니다.