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);
出典
2017-11-08 13:10:57
YSC
あなたがCを使用しているかのようにコーディングしているなぜあなたはC++を使用している場合は? '(Node *)malloc(sizeof(Node *));'(そして間違って) – CoryKramer
'string'は宣言されていません。 'priority_queue'は宣言されていません。 'vector'は宣言されていません。 – melpomene
なぜtypedef'ing構造体ですか? 'typedef struct NODE {...} Node;の後には' NODE'、 'Node'、' struct NODE'の3種類があります。 – melpomene