0

トレースを試みましたが、次のコードが VC++ で「アクセス違反」を引き起こし、gcc でセグメンテーション違反を引き起こしている理由を見つけられませんでした。

#include <vector>
#include <iostream>
using namespace std;

typedef struct node
{
    std::string data;
    vector <struct node*> child;
}NODE, *PNODE;

int main()
{
    PNODE head;
    head = (PNODE) malloc(sizeof(NODE));

    head->data.assign("hi");

    printf("data %s", head->data.c_str());
    getchar();
}
4

3 に答える 3

12

そして、一体なぜそれが機能するはずだと思いますか? mallocではなくを使用するnewため、コンストラクターは呼び出されず、実行するすべての操作が初期化されていないメモリにアクセスします。

于 2013-03-08T14:34:52.603 に答える
5

ヒープ上に C++ オブジェクトを作成するのnewではなく使用します。malloc

以下:

head = (PNODE) malloc(sizeof(NODE));

読むべき

head = new NODE;

malloc()ここで機能しない理由は、オブジェクト コンストラクターを呼び出さないためです。

于 2013-03-08T14:35:16.177 に答える
0

以前の回答に同意します。

避けるのがベストプラクティスであることを付け加えておきますusing namespaceこちらを参照)

C++ では、C のような構造体宣言を使用しないでください。

typedef struct node
   {
       std::string data;
       vector  child;
   }NODE, *PNODE;

次のようにする必要があります。

struct Node
{
    std::string data;
    std::vector<Node> child;
}

それから:

Node head;

また:

Node* head = new Node;

C++ を使用している場合は、std::cout代わりに使用しますprintf

C++ キャスト演算子もあります: dynamic_cast, static_cast, const_cast, reinterpret_cast(こちらを参照)

于 2013-03-08T14:45:12.770 に答える