linked list 관련해서
글쓴이: asleea / 작성시간: 목, 2012/05/24 - 3:19오후
#include<stdio.h> #include<stdlib.h> typedef struct Node { int number; struct Node* prev; struct Node* next; }node; void startNode(node* header, node* tail) { tail = header; tail->prev = NULL; tail->next = NULL; tail->number = 0; tail = (node*)malloc(sizeof(node)); } int main() { node* header; node* tail; startNode(header, tail); }
linked list를 구현하려고 하는데 시작부터 문제가 생기네요
컴파일은 되는데 실행 오류가 납니다.
동적 메모리 할당에서 문제가 생긴듯 한데 ..
Forums:
...
tail에 메모리가 할당되지 않은 상태에서,
tail->prev, tail->next 로 접근해서 그런것같은데요.
코드 의도는 알기 힘들지만, 최소한 다음과 같이 고쳐져야 할 것 같습니다.
#include
#include
typedef struct Node
{
int number;
struct Node* prev;
struct Node* next;
}node;
void startNode(node** header, node** tail)
{
*tail = (node*)malloc(sizeof(node));
(*tail)->prev = NULL;
(*tail)->next = NULL;
(*tail)->number = 0;
*tail = *header;
}
int main()
{
node* header;
node* tail;
startNode(&header, &tail);
}
C 에서 모든 parameter는 지역변수
C 에서 모든 parameter는 지역변수 입니다.
따라서, 주어진 코드에서
라는 식은
라는 block과 기능적으로 같습니다.
main에서 파라메터가
int main()
{
node* header; //header포인터에 메모리 할당이 되지 않아서 오류나는듯한데요?
node* tail; //오류도 아마 segmentation fault가 나지 않나 조심스럽게 추측해 봅니다.
startNode(header, tail);
}
gramo 님 댓글대로 최소한 레퍼런스를 인자로
gramo 님 댓글대로 최소한 레퍼런스를 인자로 받아야 할 것 같습니다.
에서 startNode() 내에서 어떤 일을 하던 원래의 header, tail은 변하지 않습니다.
동적 할당이 성공해도, startNode()의 지역변수인 tail을 바꿔 봐야 main()의 tail은 초기화되지 않은 상태입니다.
게다가 haeder를 초기화 한 뒤에, tail에 할당된 메모리를 대입하는 건 조금 이상해 보이는군요.
할당된 메모리를 먼저 초기화 해야 순서가 맞지 않나요?
그리고, 아마
*tail = *header;
보다는
(*tail)->prev = *header;
가 맞을겁니다.
댓글 달기