2017-11-08 26 views
-3

안녕하세요 struct * queue를 사용할 때 SIGSEGV 오류 (세그먼트 오류 11)를 만났습니다. 이 코드는 허프만 코드에 대한 것이며 알고리즘을 구현하는 데 priority_queue를 사용하고 있습니다. 나는 문제를 추측하고, 아마도 나의 코드는 큐를 초기화 할 필요가있다. 어떻게 해결하든 관계 없습니다. 이런 포인터 형 큐를 사용하지 않습니까? 인해 이중 오류} ...큐를 사용할 때 SIGSEGV 오류가 발생했습니다. <struct *>

+4

당신이 C를 사용하는 것처럼 당신은 왜 코딩 C++를 사용하는 경우? '(Node *) malloc (sizeof (Node *));'(그리고 틀리게) – CoryKramer

+0

'string'이 선언되지 않습니다. 'priority_queue'는 선언되지 않았습니다. 'vector'는 선언되지 않습니다. – melpomene

+0

구조체를 typedef'ing하는 이유는 무엇입니까? 'typedef struct NODE {...} Node; '뒤에는'NODE','Node','struct NODE'의 3 가지 타입이 있습니다. – melpomene

답변

1
Node *z = (Node *)malloc(sizeof(Node*)); 
// ... 
x = q.top(); 

typedef struct NODE{ 
long long int freq; 
string s; 
struct NODE* left; 
struct NODE* right; 
}Node; 

int main(){ 
priority_queue<Node*,vector<Node*>, compare > q; 
Node* root; 

scanf("%d",&n); 
int power = find_power(n); 

string a; 
long long int b,total; 

for (int i=1; i<=n; i++) { 
    Node* tmp = (Node*)malloc(sizeof(Node*)); 

    cin >> a >> b; 

    tmp->freq = b; 
    tmp->s = a; 
    tmp->left = NULL; 
    tmp->right = NULL; 

    q.push(tmp); 
} 
scanf("%lld",&total); 

result_fix = power * total; 

for (int i=1; i<n; i++) { 

    Node *z = (Node *)malloc(sizeof(Node*)); 

    Node* x = (Node *)malloc(sizeof(Node*)); 
    Node* y = (Node *)malloc(sizeof(Node*)); 
    x = q.top(); 
    q.pop(); 

    y = q.top(); 
    q.pop(); 

    z->left = x; 
    z->right = y; 
    z->s = ""; 
    z->freq = x->freq + y->freq; 

    q.push(z); 
    free(x); 
    free(y); 
} 



root = (Node *)malloc(sizeof(Node*)); 
root = q.top(); 
q.pop(); 

if (!q.empty()) { 
    printf("Queue is not empty!\n"); 
} 

find_bit(root,0); 

printf("%lld\n",result_fix); 
printf("%lld\n",result_huff); 

return 0; 

를 도와주세요,이 정의되지 않은 동작입니다 : 당신이 Node*를 저장하는 데 필요한 메모리를 할당

  • Node에 대한 메모리가 필요할 때;
  • malloc과 함께 메모리를 할당하면 메모리가 초기화되지 않은 채 남아 있습니다. 개체가 생성되지 않습니다. 그런 다음 영향을 주면 (x = q.top();) 구성되지 않은 개체에 Node::operator=이 호출됩니다.

해결책으로 저는 C++을 배우고 C 클래스를 쓰지 말 것을 제안합니다. 그러나보다 구체적인 솔루션으로 :

Node z = q.top; 

또는

Node *const z = new Node(q.top);