2013-02-19 5 views
0

단일 링크 된 목록의 방향을 바꾸는 프로그램을 작성하십시오. 즉, 역전 후 모든 포인터는 이제 역방향을 가리켜 야합니다.포인터 할당 중 세그먼트 오류

위의 문제를 해결하려고합니다. 나는 하나의 연결된 목록에 삽입, 검색, 삭제 및 인쇄 기능을 썼다. 이 목록에있는 모든 값을 인쇄 잘 작동

void print(list **l) 
{ 
    list *p=*l; 
    for(int i=0;p;i++) 
    { 
     cout<<p->item<<endl; 
     p=p->next; 
    } 
} 

을 다음과 같이

내 인쇄 기능입니다.

하지만 주요 기능에

나는 그것이 나에게 오류를 세그멘테이션 제공이

list *p=*l; 

같은 동일한 과제를 수행합니다.

void insert(list **l,int x) 
{ 
    list *p; 
    p=(list *)malloc(sizeof(list)); 
    p->item=x; 
    p->next=*l; 
    *l=p; 
} 

인쇄 기능에서 내가 할 과제와 주요 기능의 차이는 무엇인가를 다음과 같이

main() 
{ 
    list **l; 
    *l=NULL; 
    int n; 
    while(cin>>n) 
    insert(l,n); 
    list *p=*l; 
    list *prev=NULL; 
    list *next; 
    while(p) 
    { 
     next=p->next; 
     p->next=prev; 
     prev=p; 
     if(next==NULL) 
     *l=p; 
     p=next; 
    }  
    print(l); 
} 

내 삽입 기능은 다음과 같이 내 주요 기능은 무엇입니까? 왜 인쇄 기능에 오류가 없으며 주 기능에서 세그먼트 오류가 발생합니까? 내 기능은 내가 어떤 오류가 발생하고 있지 않다이

main() 
{ 
    list **l; 
    *l=NULL; 
    int n; 
    while(cin>>n) 
    insert(l,n); 
    print(l); 
} 

같은 경우

나는 삽입하고 목록의 값을 인쇄 할 수 있어요.

+2

'list ** l;'은 매달린 포인터이므로 '* l = NULL;'은 정의되지 않은 동작입니다. – enobayram

+0

@enobayram 값을 올바르게 삽입하고 있습니까? – user2086900

+0

예, 삽입 기능을 올바르게 삽입하고 있지만 C++에 대해서도 전반적인 접근 방식은 C에 ​​대해서도 부적절합니다. 'std :: list '을 사용하지 않는 이유가 있습니까? C와 같은 코드를 만들고 싶다면'list * l = NULL;'을 사용하고'print (& l)'로 전달하면된다. – enobayram

답변

3

당신은 당신이 잘못된 포인터를 역 참조하고

list **l; 
*l=NULL; 

쓰기 때문에 정의되지 않은 동작으로 실행합니다.

함수 내부에서 유효한 포인터를 인수로 전달 중입니다. 이 경우

list* l; 
void print(&l) 

예를 들어, &llist**이다 - 그것은 그렇게 포인터 ( l 자체)을 수득한다 역 참조, 댕글 list* 가리키는. l은 초기화되지 않았지만 읽을 수는 없습니다.

+0

list * p = * l; 이 줄을 제거하면 어떤 오류도 발생하지 않습니다. – user2086900

+0

두 번째 경우에는 내 게시물을 업데이트했습니다. 오류가 발생하지 않습니다. – user2086900

+0

@ user2086900 그것은 정의되지 않은 동작입니다. 내가 지적한 라인들은 유효하지 않다. –

1

당신은 쓰기 :

list **l; 
*l=NULL; 

그러나 리터가 할당되지 않은, 당신은 값을 알고하지 않기 때문에 * L = NULL 당신이 알고하지 않기 때문에 정의되지 않은 행동이며, 메모리의 어느 영역 당신 ' 다시 변화.

관련 문제