2017-11-08 18 views
-3

こんにちは、構造体*キューを使用すると、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); 
関連する問題