2012-09-17 4 views
1
typedef struct { 
char name [25] ; 
char breed [25] ; 
int age ; 
struct animal *next ; 
} animal ; 

animal *ptr1 , *ptr2 , *prior ; 
ptr1 = (animal*)malloc(sizeof (animal)) ; 
strcpy ((*ptr1).name , "General") ; 
strcpy ((*ptr1).breed , "Foreign breed") ; 
(*ptr1).age = 8 ; 


(*ptr1).next = NULL ; 
prior =ptr1 ; 
printf ("%s\n" , (*prior).name) ; 
printf ("%s\n" , (*prior).breed) ; 
printf ("%d\n" , (*prior).age) ; 
printf ("%p\n" , (*prior).next) ; 
free (ptr1) ; 
ptr1 = (animal*)malloc(sizeof (animal)) ; 
strcpy ((*ptr1).name , "General 1") ; 
strcpy ((*ptr1).breed , "Abroad breed") ; 
(*ptr1).age = 24 ; 
(*ptr1).next = NULL ; 
(*prior).next = ptr1 ; 

다음은 연결 목록을 그리는 코드입니다. 전체 코드가 실행은 마지막 줄에 오류를 표시 할 때 :링크 된 목록 구문

기능에서

'주' 경고 : 기본적으로 사용] 호환되지 않는 포인터 타입

+0

오류가 발생하는 곳을 지적하면 도움이 될 수 있습니다. 컴파일 오류 (즉, 프로그램의 오류가 아니라 컴파일러에서 코드의 일부 문제에 대한 오류)이므로 오류 메시지에 줄 번호가 포함되어 있습니다. 앞으로는 완료되고 편집되지 않은 _all_ 메시지를 게시하십시오. –

+1

이전 줄의 마지막 줄은 이전에 해제 된 메모리 영역을 가리키고 있습니다. 이로 인해 프로그램이 중단 될 수 있습니다. – Jack

+2

'(* ptr1) .next' 대신에''ptr1-> next''를 사용하고 있습니까? –

답변

0

은 "태그"이름 공간합니다 (struct 후 이름)과 식별자 이름 공간 (당신이 typedef로 선언 한 예.)

가장 쉬운 C.

에 구별되는, 내가 찾아이다

: 쉽게 심지어 struct의 선언 내부의 typedef 이름을 사용할 수에 그때부터

typedef struct animal animal; 

: 항상 앞으로 struct 태그와 typedef에서 한 가지를 선언

struct animal { 
    .... 
    animal* next; 
}; 
+0

당신의 도움과 반복으로 나를 항해 시켰습니다. 고맙습니다. –

+0

@sauravverma, 답변으로 도움이 되었으면 투표에 응답 한 다음 질문에 실제로 답변하고 "동의"한 답변을 선택하십시오. –

0

animal에서 할당의 이름입니다 typedef가 아니라 struct. 대신이 시도 : Animal_없이이

typdef struct Animal_ 
{ 
    char name [25]; 
    char breed [25]; 
    int age; 
    struct Animal_* next; 
} Animal; 

typedef struct _animal { 
    char name [25]; 
    char breed [25]; 
    int age; 
    struct _animal *next; 
} animal; 
+0

선행 밑줄이있는 글로벌 이름은 예약 된대로 사용해서는 안됩니다. –

+0

그리고이 경우 밑줄도 필요 없다.'typedef struct animal {...} 동물;은 완벽하게 유효합니다. –

1

변화 당신의 structue 정의를 구조체 익명 구조체이며, 포인터를 가질 수 없습니다.

typedef struct animal { 
    char name [25] ; 
    char breed [25] ; 
    int age; 
    struct animal *next; 
} animal; 

구조는 태그 animal이 선언에 추가되었습니다 : 당신의 선언에

+1

밑줄은 필요하지 않습니다. –

1

변경합니다. struct animal의 별칭은 animal입니다.

0

실제로 경고가 아닌 오류입니다. 나는 왜 s-> m 대신에 (* s) .m을 사용하는지 모르겠다. 더 간단하고 자연 스럽습니다. 코드에서 함수 main이 보이지 않고 오류가 발생한 줄이 보이지 않습니다. 구조체 선언을 제외한 모든 코드가 main 함수라고 가정합니다. 구조체를 다음과 같이 선언 해보십시오 (컴파일러에 따라 "typedef struct animal"을 추가해야 할 수도 있음). struct animal { ... animal * next; };