2017-12-06 5 views
-1

C에서 링크 된 목록으로 작업하고 있지만 포인터를 사용하지 않는 것이 좋습니다.함수 후 포인터가 null입니다.

나는 연결된 목록 구조가 있습니다. 첫 번째 요소를 NULL로 초기화합니다. 이 포인터를 malloc을 사용하여리스트의 새로운 요소를 만드는 함수에 보낸다. 그러나 함수 호출 후에는 my 요소가 여전히 NULL입니다. 나는 이해하지 못한다. 그것은 확실히 바보 같은 오류가 발생하지만 약간의 도움이 필요합니다 ..

typedef struct Goto Goto; 
struct Goto 
{ 
    int index; 
    Goto *next; 
}; 


//my code 
Goto* gotoList = NULL; 
addLabel(gotoList, index); 
// Here : gotoList is NULL 


void addLabel(Goto* gotoList, int value) { 
    if (gotoList == NULL) { 
     Goto* gotoLabel = malloc(sizeof(*gotoList)); 
     gotoLabel->index = value; 
     gotoLabel->next = NULL; 
     gotoList = gotoLabel; 
    } 
    else { 
     Goto* gotoLabel = gotoList; 
     Goto* newLabel = malloc(sizeof(*newLabel)); 
     newLabel->next = NULL; 
     newLabel->index = value; 
     while (gotoLabel->next != NULL) { 
      gotoLabel = gotoLabel->next; 
     } 
     gotoLabel->next = newLabel; 
    } 
// Here : gotoList is not NULL 

} 변화를 만들기 위해 나에게

+1

'Goto'유형을 호출하는 것이 가장 좋은 방법은 아닙니다. –

+0

당신의 문제는'c '의 모든 것이 값으로 전달된다는 사실에 뿌리를두고 있습니다. 'gotoList'의 로컬 사본은 당신이 그 함수를 호출 할 때'addLabel'에서 만들어지고 그 범위는 그 함수에만 존재합니다. 'gotoList'에 대한 변경 사항을'addLabel' 밖에서 유지하려면'gotoList'를 반환하거나 포인터 ('Goto **'유형)를 전달하고 함수에서 해당 포인터를 참조 해제해야합니다. – yano

답변

1

음을 돕는

감사하는 중 당신은 호출자에서 변수의 주소를 통과해야 함수 또는 호출 수신자로부터 반환 된 함수는 할당 된 메모리의 주소를 함수로 변환하고 해당 변수에 할당합니다.

여기서는 아무 것도하지 않으므로 변경 사항을 유지할 수 없습니다.

변수의 주소를 전달하면 다음과 같이 할 수 있습니다. (다른 하나는 완전히 이해할 수 있으면 쉽게 수행 할 수 있습니다).

void addLabel(Goto** gotoList, int value) { 
    if (*gotoList == NULL) { 
     Goto* gotoLabel = malloc(sizeof(*gotoLabel)); 
     gotoLabel->index = value; 
     gotoLabel->next = NULL; 
     *gotoList = gotoLabel; 
    } 
    else { 
     Goto* gotoLabel = *gotoList; 
     Goto* newLabel = malloc(sizeof(*newLabel)); 
     newLabel->next = NULL; 
     newLabel->index = value; 
     while (gotoLabel->next != NULL) { 
      gotoLabel = gotoLabel->next; 
     } 
     gotoLabel->next = newLabel; 
    } 
} 

여기서 우리는 단순히 변수의 주소를 전달합니다. 당신은 변수의 이름을 선택하는 당신은 나쁜 선택의 여지가,이

addLabel(&listhead,val); 

한 가지 같은 함수를 호출합니다. Goto은 변수 이름의 마지막 선택입니다. 에서 Cgoto는 키워드입니다, 그것의 약간 변이에 변하기 쉬운 이름을 붙이는 것은 오도 된뿐만 아니라 의미에서 역시 틀린 것입니다.

+0

고마워요! 사실 내 눈금자는 포인터 였기 때문에 값을 변경할 수 있다고 생각했지만 실제로 포인터에 대한 포인터가 필요합니다. 그리고 나는 고토가 C 키워드 였다는 것을 몰랐다. 나는 바뀔 것이다 – iAmoric

+0

@iAmoric .: 포인터는 값을 바꿀 수 있다는 것을 의미하지 않는다. 그것은 단지 주소 일 뿐이므로 주소의 내용으로 무엇이든 바꿀 수 있습니다. – coderredoc

+0

네, 그게 고기인데 포인터를 사용하여 주소의 내용을 변경하십시오. 어쨌든, 도와 줘서 고마워. 질문이 해결되었습니다. – iAmoric

관련 문제