2009-08-27 8 views
2

가 나는 것은 현재 버킷 = 새로운 기지국 * SIZE]NULL와 클래스에 대한 포인터를 초기화는

로 초기화된다

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

the private member of my other class is declared as 

Node** buckets; 

만든 노드 구조체 포인터 배열을 초기화하기 위해 트링하고 값

배열을 초기화하여 배열의 멤버가 NULL 또는 다른 미리 정의 된 노드 포인터를 가리 키도록 할 수 있습니까?

EDIT : 배열의 전체 길이를 통과하는 for 루프를 생성하지 않고 initilize하는 방법을 찾고 있습니다. 배열의 크기는 런타임에 결정됩니다.

편집 2 : 나는 std :: fill_n (버킷, SIZE_OF_BUCKET, NULL)을 시도했다; 하지만 컴파일러는 "const int '에서'Node * '로 변환 할 수 없습니다."라는 오류 메시지가 나타납니다. Visual Studio 2008을 사용하고 있습니다. 내가 잘못하고있는 것이 있습니까?

답변

7

먼저, 가장 간단한 솔루션은 다음을 수행하는 것입니다 : 앞서 언급

Node** buckets = new Node*[SIZE](); 

litb,이 포인터를 null로 SIZE 포인터를 초기화 가치 것입니다. 당신이 Node **buckets처럼 뭔가를 특정 값으로 포인터를 모두 초기화 할 경우

그러나, 나는 이것이 pNode* '을 설정합니다 <algorithm>

Node **buckets = new Node*[SIZE]; 
std::fill_n(buckets, SIZE, p); 

에서 std::fill_n 추천 할당 후.

또한 노드가 생성시 정상적인 멤버 값을 가지게하려면 올바른 방법은 생성자를 사용하는 것입니다. 이런 식으로 뭔가 :

struct Node { 
    Node() : data(0), next(NULL){} 
    Node(int d, Node *n = NULL) : data(d), next(n) {} 

    int data; 
    Node* next; 
}; 

이 할 수있는 방법 :

Node *p = new Node(); 

하고 제대로 0과 NULL로 초기화됩니다, 또는 마지막으로

Node *p = new Node(10, other_node); 

을,이 일을 :

Node *buckets = new Node[N](); 

NNode 개체 및 기본 구성하십시오.

+0

좋아,이 질문이 통합되어 있고 대답이 오래 되었기 때문에 내 대답이 삭제되었습니다. 그 라인을 맨 위로 이동하여 사람들이 먼저 읽도록하십시오. –

+0

전화가 잘 걸렸습니다. –

+0

나는 std :: fill_n (버킷, SIZE_OF_BUCKET, NULL)을 시도했다; "const int '에서'Node * '로 변환 할 수 없습니다. Visual Studio 2008을 사용하고 있습니다. – Jaelebi

1

배열로 배열 포인터가 buckets 인 경우 그렇다. buckets = NULL으로 설정하면됩니다.

편집 : 질문에 따라 편집하십시오. memset을 사용하십시오. 모든

memset(buckets, 0, NUM_ELEMENTS_IN_BUCKETS*sizeof(Node*)); 
+0

sizeof (anypointer)는 항상 4와 같지 않습니다. 요즘 –

+3

기술적으로 memset을 사용하여 포인터를 0으로 설정하는 것은 NULL로 설정하는 것과 다릅니다. 표준에서는 포인터 컨텍스트에서 사용되는 0 상수가 null 상수라고합니다. 그러나 이것은 포인터의 실제 비트 패턴을 0으로 설정하는 것이며, 이는 반드시 null 상수가 아닙니다. –

+0

sizeof (모든 포인터)가 항상 4가 아닌 올바르지 않은 부분을 제거했습니다. – peterchen

관련 문제