2010-03-09 3 views
1

이것은 숙제가 아닙니다. 20 년 이상 학교에 다니지 않았으며 전혀 링크 된 목록을 사용하지 않아도됩니다. . 그래서 나는 여기서 내 요소에서 벗어났다. 어쨌든, 나는 연결리스트에 대한 매우 간단한 구조체이다데이터의 로컬 복사본을 연결된 목록으로 만들기

struct Data_Struct { 
    char *Name; 
    char *Task; 
    char *Pos; 
    struct Data_Struct *Next; 
}; 
typedef struct Data_Struct MyData; 

있습니다.

데이터가 char *에 저장되어 있으며 목록을 채울 때 포인터가 복사됩니다. 모두 정상입니다. 문제는 그 포인터가 덮어 씌워지고 원래의 데이터를 잃을 때 시작됩니다. 모든 "list_add()"에 로컬 char * malloc'ed로 데이터 복사를 시도했지만 충돌 또는 데이터 손실 중 하나를 유지합니다. 예, 충분히 할당하고 예, 데이터를 복사하고 올바르게 복사되었는지 확인합니다. 나는 memcpy, strcpy 등으로 시도했다.

내가 궁금한 점이 있으므로 목록에 추가 할 데이터가 로컬인지 어떻게 확인해야합니까? 그 char *를리스트에 지역 변수로 복사하는 방법은 무엇입니까?

이 작업을 수행하는 방법과 내 코드가 좋지 않은 이유에 대한 설명은 괜찮습니다. 설명이있는 코드를 선호합니다. 감사합니다.

제스.

답변

4

"로컬로 복사"하지 않으려면 완료했다고 말하고 싶습니다. malloc()을 사용하여 새 메모리를 할당하고, 거기에 데이터를 저장하고 포인터를 목록 노드에 저장하십시오.

가지고있는 경우 strdup()을 사용하면 malloc() + strcpy()을 하나의 호출로 결합 할 수 있습니다.

데이터를 덮어 쓴 경험이있는 상황을 이해하기 란 쉽지 않습니다. 그 원인이 목록 노드에서 무엇을하고 있습니까?

기본 앞에 추가

는 노드 정의를 위해, 다음과 같이한다고 :

MyData * list_prepend(MyData* head, const char *name, const char *task, 
        const char *pos) 
{ 
    MyData *node = malloc(sizeof *node); 
    node->Name = strdup(name); 
    node->Task = strdup(task); 
    node->Pos = strdup(pos); 
    node->Next = head; 
    return node; 
} 

은 분명히이 오류 처리를 (malloc()strdup() 모두가 실패 할 수 있습니다)이 부족하다. 앞에 이 붙어 있고이며 목록의 새 머리글이 반환됩니다.

관련 문제