2014-04-11 5 views
1

그래서, 내가 가진 구조 :구조체 포인터에 대한 설명을 찾고

typedef struct { 
    int (*compare)(const void *a, const void *b); 
    struct node *head; 
    struct node *tail; 
} *QueueADT; 

그것을 호출 "* QueueADT는"자동 포인터에있는 "QueueADT"항목을 만드는 것이 나의 이해는합니다. 따라서 :

QueueADT queue; 

이전에 정의 된 구조에 대한 포인터 일 수 있습니다. 그런 구조를 어떻게 malloc하는지 궁금합니다. 일반적으로 다음과 같습니다 :

QueueADT queue = malloc(sizeof(QueueADT)); 

그러나 "QueueADT"는 포인터가 아닙니다. 그래서 당신은 단지 큐 구조체에 대한 포인터를위한 충분한 메모리를 할당하지 않습니까? 내 코드를 사용하여 valgrind에 잘못된 쓰기가 발생했습니다. 내 큐가 잘못 초기화 된 결과입니다.

+4

내가 사용하려면 QueueADT queue = malloc (sizeof * queue); – pmg

+0

불투명 한 데이터 유형으로 사용하지 않는 한 typedef 뒤에 포인터를 숨기는 것은 좋지 않은 생각이다. 또한 같은 이름을 사용하여 태그에 대한 struct 태그와 typedef를 정의 할 수 있습니다. – Deduplicator

답변

4

그것은 다음과 같이 그것에 구조와 포인터를 모두 유형을 정의 할 정상 :

typedef struct { 
    ... 
} QueueADT, *pQueueADT; 
당신이 제안대로 다음 sizeof(QueueADT)을 사용할 수 있습니다

:

pQueueADT queue = malloc(sizeof(QueueADT)); 
+0

정말 고마워요. 나는 그런 문제를 야기한 문제를 마침내 격리하고 고치기를 열망합니다. – user3525381

0
QueueADT queue = malloc(sizeof(*queue)); 
+2

이것은 답변을 제공하지만 OP가 이것을 사용해야하는 이유에 대한 설명이 없기 때문에 아직 좋은 대답은 아닙니다. 표시된대로 코드를 변경 한 이유를 설명하는 것이 좋습니다. –

관련 문제