2012-06-29 5 views
3

I C에 연결 목록에서 일반 데이터를 제거하려면 다음 기능이 있습니다C 무효 포인터와 포인터 비교

void removeData(void *data, struct accList *theList) 
{ 
    struct accListNode* cur = theList->head; 
    struct accListNode* prev = NULL; 

    for(; cur != NULL; prev = cur, cur = cur->next) 
    { 
     if(cur->data == data) 
     { 
      if(cur == theList->head) 
      { 
       theList->head = cur->next; 
      } 
      if(cur == theList->tail) 
      { 
       theList->tail = prev; 
      } 
      if(prev != NULL) 
      { 
       prev->next = cur->next; 
      } 
      free(cur); 
      return; 
     } 
    } 
} 

cur->data == data 뒤에있는 의미는 무엇입니까?

내 데이터는 일반 (void*)이므로 모든 기본 유형 및 구조 유형에 대해 이것이 무엇을 의미합니까?

예를 들어, 직원의 구조를 고려 :

struct employee 
{ 
    char name[20]; 
    float wageRate; 
}; 

어떻게 것 문 cur->data == data 작업 데이터 유형 struct employee* 인 경우? 데이터는 구조체의 첫 번째 메모리 주소에 대한 포인터이므로 포인터 주소를 비교하고 있습니까?

+2

포인터 주소 (예 :'& data')를 비교하지 않고 주소 인 포인터를 비교하고 있습니다. – sczizzo

답변

7
cur->data == data 

포인터 data 포인터 cur->data를 비교합니다. 당신은 그들의 주소가 아닌 그들의 가치를 비교하고 있습니다. 포인터는 다른 것과 마찬가지로 변수입니다. 주소 (즉, &some_ptr)와 값 (즉, 참조하는 항목의 주소)이 있습니다.

참고 비교 포인터가 당신이 알고하지 않으면 의미가 그렇게하도록 만들 것이라고 말 (안 과거 같은 배열 또는 하나의 요소를 가리하지 않는 (즉, >>=<=<가) 정의되지 않은 동작이 발생할의 다른 유형 그들은 어쨌든 연속 메모리의 동일한 덩어리에 거주하는 "객체"를 지적했지만 여전히).

+0

그래서 cur-> data와 data가 가리키는 값의 주소를 비교하고 있습니까? – CodeKingPlusPlus

+0

@CodeKingPlusPlus : 예, 그 주소는 포인터의 값입니다. 포인터 자체는 여전히 메모리를 저장해야하기 때문에 자신의 주소를 가지고 있지만'some_ptr'과'& some_ptr'는 동일하지 않습니다. –

+0

일반 데이터의 값을 비교하고 싶습니다. 이게 진짜 가능하니? 호출자가 제네릭 형식의 평등을 정의하는 함수에 대한 포인터를 제공해야하는 추가 매개 변수를 추가해야하는 것처럼 보입니다. 이게 옳은 것 같니? – CodeKingPlusPlus

2

가리키는 구조체가 아니라 포인터의 열 자체를 비교하고 있습니다.

+0

이 포인터는 바로 주소 일뿐입니다? 그래서 내 비교는 아무 것도 좋지 않다. – CodeKingPlusPlus

+0

@CodeKingPlusPlus 글쎄, 그것은 처음부터 목록에서 포인터를 얻었는지 아니면 가리키는 것과 동일한 것을 제거하고 싶은지에 달려있다. 대부분 후자가 될 것 같습니다. – tommyo

3

cur-> data == data의 의미는 무엇입니까? 이 코드는 확인하고 있습니다

는 모두 포인터 (무효 *)이이 모든 원시 유형 및 구조 형식에 대해 무엇을 의미 하는가 같은 포인터

내 데이터가 일반적이기 때문에입니다입니까?

데이터가 struct employee * 인 경우 명령문 cur-> data == data는 어떻게 작동합니까? 데이터가 난 그냥 포인터 주소를 비교하고 구조의 첫 번째 메모리 주소에 대한 포인터이기 때문에

아무것도 비교는 같은

작동?

아니, 당신은 포인터

+0

이 포인터는 바로 주소입니까? – CodeKingPlusPlus

+0

@CodeKingPlusPlus 예, 그들은 단지 주소입니다. 사실 그들은 내용이 주소 인 주소입니다. – higuaro

+0

내가 원하는 것은이 포인터의 "값"을 비교하는 것입니다. 호출자가이 제네릭 형식의 "동등성"을 설명하는 함수에 대한 포인터를 제공 할 수 있도록 추가 매개 변수를 내 함수에 추가해야하는 것처럼 보입니다. 이게 옳은 것 같니? – CodeKingPlusPlus

0

난 당신이 removeData를 작성하지 않은 같은데요를 비교하고()? 그렇다면 설명은 다음과 같습니다.

removeData()는 연결된 목록에서 특정 항목 (즉, * 데이터)을 제거하도록 설계되었으며 내용이 * data가 아닌 항목은 삭제하지 않습니다. 따라서 removeData()의 호출자는 항목이 free() 된 것을 정확히 알고 있어야합니다.그들은 그것 자체를 자유롭게 할 수는 있지만 그것은 링크 된리스트가 그것에 대한 포인터를 여전히 포함하고 있기 때문에 좋지 않을 것입니다. 아마도 아마도 연결된리스트의 다른 사용자들은 free() 된 객체가 여전히 유효하다고 생각할 것입니다. 다르게 믿을 이유는 없습니다.

* 데이터의 내용과 일치하지만 (* data와 같은 메모리에 있지 않은) 항목을 theList에서 검색하는 함수를 원할 경우 removeData() 버전을 작성해야합니다. 각 유형 및 accList는 동질성 (해당 유형의 모든 객체 포함)이거나, accList에는 각 항목 유형 (예 : enum) 및 removeData()의 각 버전이 포함되어야합니다. 각 유형에 하나씩) 자체 유형과 일치하지 않는 요소는 건너 뛸 필요가 있습니다.