2011-08-29 3 views
3

를 만드는 동안 :사용 다음 프로그램에서 연결리스트에게

// illustration of linked list 
#include <iostream> 

using namespace std; 

struct node { 
    int data; 
    struct node* next; 
}; 

struct node* buildList(); 

int main() { 

struct node* head = buildList(); 
cout << head->data; 
} 

struct node* buildList() { 
    struct node* head = NULL; 
    struct node* second = NULL; 
    struct node* third = NULL; 

    head = new node;  // builds up a pointer structure on heap 
    second = new node; 
    third = new node; 

    head->data = 1; 
    head->next = second; 

    head->data = 2; 
    second->next = third; 

    head->data = 3; 
    third->next = NULL; 

    return head; 
} 

내가 여기 new 작업자의 작업의 인식입니다. 그들이 수행하는 업무는 무엇입니까? (나는 heap에 공간을 할당한다는 것을 읽었습니다. 그러나 그것이 의미하는 것이 무엇인지 모르겠습니다.)이 문장을 제거하면 출력이없고 프로그램이 충돌합니다. 왜 그런가요?

+3

1) 이것은 연산자가 아닌 "새로운 * 표현식 *"입니다. 2) 책을 버리십시오 - '새로운 것'은 역동적 인 저장 공간과 수명을 가진 새로운 객체를 만듭니다. 이것이 중요한 것입니다. –

답변

3

head, second 및 third 변수는 메모리의 노드에 대한 포인터입니다. 그러나 사용하기 전에 메모리의 유효한 노드를 가리켜 야합니다. 이것은 새로운 연산자가 들어오는 곳입니다. 힙은 동적으로 객체를 생성하기 위해 프로그램에 할당 된 메모리 영역입니다 (차이점은 here 참조).

0

struct node* head = NULL;는 ->

그래서 UR 만약 해당 메모리의 시작 노드 및 포인트 헤드의 크기에 메모리를 할당한다 ->은

head = new node; 포인터 (인해 할당 널 포인트)를 생성 포인터가 NULL이고 노드 (또는 그 이상)를 가리 키지 않는다고 말하면 포인터 또는 포인터로의 모든 연산이 실패합니다.

3

* 편집 * 난 그냥 내 대답하기 전에 추가 거라고 생각

:

스택은, 간단한 용어, 프로그램이 현재 작업하고 다소 임시되는 장소. 제 말은 main() 함수가 다른 함수를 호출 할 수 있다는 것입니다. 이 함수는 자체 범위 ({} 사이의 영역), 자체 로컬 변수, 공간 등을 가지며, 다른 함수를 호출 할 수 있습니다. 이 함수들은 계속 "스택에"배치됩니다. 함수가 반환되면 스택에서 제거되고 시작한 다음 레벨 업 함수의 지점으로 되돌아갑니다. 마치 현재 노트 위에 종이 조각을 집어 넣은 다음 노트를 찍은 다음 원본 페이지로 돌아가는 것처럼 제거한 것입니다. "스택 변수"는 함수 내에서 정상적인 방법으로 만드는 변수이며 범위를 벗어날 때 죽거나 파괴됩니다.

힙 변수는 정적/전역 변수이거나 "new, malloc 등"을 사용하여 만든 변수입니다. 이 변수는 영구적이며, 명시 적으로 delete를 호출 할 때까지 유지되거나 존재합니다. 그들은 생성 된 범위 밖에서 살아남을 것이며, 자신의 자원을 추적하지 않으면 리소스가 취소 될 수 없으며 메모리/리소스 유출이 발생합니다.

일반 포스트

의 선 : 노드가이 노드에 대한 포인터한다고 후

struct node* head = NULL; 
struct node* second = NULL; 
struct node* third = NULL; 

모든 생성 포인터 * 표시입니다. 이 포인터는 NULL 또는 0으로 초기화됩니다. 포인터는 단지 메모리 주소/위치이며, 아직 노드 객체가 없습니다.그래서,

node* ptr = NULL; //creates pointer to a node object, but no node itself. 
node obj;   //creates an actual node object on the stack. 
포인터가이 같은 & 연산자의 주소를 복용하여 스택 기반 객체를 가리 키도록 사용할 수 있습니다

: 귀하의 경우

node obj; //Real object. 
node* ptr = &obj; //ptr points to the "address of" obj. 

, 노드 포인터를 가리 키지 않습니다 당신이 "새"로 그것을 창조 할 때까지 아무거나. 그 후 포인터는 "동적으로 할당 된"메모리를 가리키며,이 메모리는 "삭제"를 호출 할 때까지 영원히 계속됩니다. 이것의 특권은 그것이 생성 된 함수 밖에서 메모리가 지속될 수 있다는 것입니다. 그래서 :

void myFunction() 
{ 
    node obj; 
} //obj dies here. 

void myOtherFunction() 
{ 
    node* ptr = new obj; 
} //the "node" created by new will survive after this. 

나는 갈 수 있지만, 당신은 C++ 책을 읽고이를 이해할 필요 - 포인터가 완전히 배울 필요가 언어의 핵심 부분입니다.

0

new은 해당 유형의 새 개체를 만듭니다.

이 경우 새 노드가 구성됩니다. 그러나 일부 코드에서는 그렇게 할 필요가 없으며 간단히 객체를 사용할 수 있습니다. 즉 노드 헤드; head.data = 1; head.next = blah.

새로운 이유는 단순히 해당 유형의 "새"개체를 만드는 것입니다. 일반적으로 역동적 인 일에 사용됩니다.이 경우 연결된 목록처럼 보입니다. 그렇기 때문에 새로운 것이 필요합니다. 하지만 새로 작성 할 때마다 으로 끝내면 데이터를 삭제해야합니다. 그렇지 않으면 메모리 누수가 발생합니다.이 경우 목록이 커지고 더 이상 필요하지 않은 것을 해체하지 않으면 더 많은 메모리가 낭비 될 것입니다.

그러나이 코드를 전혀 사용할 필요가 없습니다. 오히려 이미 표준 라이브러리에는 이러한 유형의 지원을 제공하는 컨테이너와 측면의 추가 기능이 있습니다.

#include <list> 
// and use 
std::list<type> data; 

할 수 있습니다 쉽게 삽입이 목록에서 데이터를 삭제하고 당신의 할당 및 할당 취소를 처리합니다; 즉, 새로 사용하거나 삭제할 필요가 없으며 메모리를 관리하고 메모리 누수가 없다고 가정 할 수 있습니다.

+1

'실제 코드'를 작성할 때 표준 라이브러리 내용을 사용해야하는 반면 책의 예제 코드 (예 : 포인터 및 데이터 구조에 대해 학습)와 비슷합니다. – crashmstr

관련 문제