2011-04-20 7 views
1

C에서 포인터와 구조체에 문제가 있습니다 (알다시피, 아주 간단합니다!). 나는 절차 적 패러다임을 실천하고 있었다. 디버거를 사용하는 것은 처음입니다. 왜냐하면 저는 제 인생에서 일찍부터 필요하지 않았기 때문입니다. < 그래서 제게 도움을 주시면 고맙겠습니다.C 포인터의 문제점

int main(int argc, char** argv) { 
    node_t * list = NULL; 
    addNodo(list, 1); 
    printf("x: %d", list->info); 
    return (EXIT_SUCCESS); 
} 

:이 일을하고

void addNodo(node_t * list, int x){ 
    node_t * pointer; 
    node_t * temp; 

    temp = (node_t *)malloc(sizeof(node_t)); 
    temp->info = x; 
    temp->next = NULL; 
    temp->prev = NULL; 

    pointer = list; 

    if(pointer == NULL){ //it's empty so start it 
     list = temp; 
     return; 
    } 

    if (pointer->info <= x) { //I like my lists tidy so... 
     while((pointer->next != NULL) && (pointer->info <= x)){ 
      pointer = pointer->next; 
     } 

     if(pointer->next == NULL){ 
      pointer->next = temp; 
      temp->prev = pointer; 
      return; 
     } 

     pointer->next->prev = temp; 
     temp->next = pointer->next; 
     temp->prev = pointer; 
     pointer->next = temp; 
     return; 
    } 
} 

를 실행 한 다음, 그것을 채우기 위해

typedef struct node { 
    int info; 
    struct node *next; 
    struct node *prev; 
} node_t; 

그리고이 함수 :

나는 목록을 만들기 위해 다음과 같은 구조를 정의 그것은 나에게 분할 오류를 던지고있어! 내가 디버깅 할 때 ++++ 행을 지날 때까지 모든 것이 재미 있고 게임이다. 목록 주소는 0x0으로 돌아가서 작동하도록 할 수 없다. 어딘가에 오류가 있다는 것을 알고 있지만, 포인터에 대한 지식으로는 완벽합니다. 제발 내 실수를 감지하고 몇 가지 조언을 가르쳐주세요.

+0

nodo_t은 무엇입니까? – TimFoolery

답변

4

addNode()을 호출하면 값으로 포인터가 전달됩니다. 따라서 함수 본문에서 변경하면 변경 내용이 손실되고 함수 외부로 전파되지 않습니다.

void addNode(node_t **pointer, int x) 

다음으로이 함수를 사용하십시오.

그리고 당신은 주에서 성만을 호출 할 때, 당신은 고전적인 실수 만들고있어 &list

+0

정말 고맙습니다. 내 앞에서 옳았 어 !! – fixmycode

+0

당신을 진심으로 환영합니다! – QuantumMechanic

0

전달 :

list

void addNodo(node_t * list, int x) 
... 

list = temp; 
return; 
가 호출자 (주())

변경되지 않습니다

메모리의 값을 list 점으로 변경할 수는 있지만 list 값을 변경하여 호출자가 볼 수는 없습니다.

그렇게하기 위해서는, 당신은 함수에 대한 포인터에 대한 포인터를 전달해야 할 것 :

*list = temp; 
1
:

void addNodo(node_t **list int x) 

이것은 당신이에 무엇을 목록 점을 수행하여 변경할 수 있습니다

문제는 addNodo 함수 내에서 목록을 수정할 수 없다는 것입니다. C에서 매개 변수는 값에 의해 보내 지므로 "addNodo"내부에서 변경 한 내용은 거기에 국한됩니다.

addNodo 함수를 변경해야하므로 실제로 목록의 방향을 수신해야합니다.

void addNode(node_t **list, int x){ 
    ... 
    if(*pointer==NULL){ 
    *list = temp; 
} 
} 

는 다음 주에 당신은 사용해야

addNode(&list, 1); 
1

글쎄, 당신은 값 목록의 주소를 전달하는 실수를하고있다. 따라서 함수의 모든 인수는 사본으로 만들어지고 addNodo()는 복사 된 변수에 적용됩니다. 따라서 원래 목록은 수정되지 않습니다.

pointer = *list; 
    /* this will make the pointer point to the beginning of list as now 
     list is a pointer to pointer type */ 

는 희망이 도움이 :

void addNodo(node_t ** list, int x) 
/* This will enable you to get a copy of the address of the list variable. 
    Please note that this is also pass by value, C does not support pass by 
    reference */ 

그런 다음이 변경 :

기능에
addNodo(&list, 1); 

을 다음과 같이 변경합니다

은 무엇 호출하는 동안 당신이 일을해야하는 것은 이것이다 당신.

BTW, C에서 인수를 전달하고 내부적으로 어떤 일이 발생하는지 잘 알고 싶다면 표준 C 책 (K & R 권장)을 실행하십시오.