3

クラスのメンバーとして使用される構造体へのポインターとの混乱を取り除こうとしています。次のコードを書きましたが、プログラムをコンパイルしてもクラッシュします。次のコードで私が間違っていることを言っていただけますか?

#include<stdio.h>
#include<string.h>

struct a{
    int s;
    int b;
    char*h;
};

class test
{
public:
    a * f;
    void dh();
    void dt();
};

void test::dh()
{
    a d;
    d.s=1;
    d.b=2;
    d.h="ffdf";
    f=&d;
}

void test::dt()
{
    printf("%s %d %d",f->h,f->b,f->s);
}

int main()
{
    test g;
    g.dh();
    g.dt();
    return 0;
}
4

3 に答える 3

8
void test::dh()
{
    a d; <--
    d.s=1;
    d.b=2;
    d.h="ffdf";
    f=&d; <--
}

ローカルオブジェクトを作成し、次にこのオブジェクトのアドレスにd設定します。f関数が終了すると、オブジェクトはスコープ外になり、ダングリングポインタが残ります。

于 2012-04-26T22:28:20.043 に答える
4

あなたの最大の問題は、dh()戻ってくるまでに、dもはや範囲内にないということです。の代わりにa d;dh()が必要f = new a(); f.s=1; f.b=2, f.h="ffdf";です。

于 2012-04-26T22:29:39.460 に答える
2

test :: dhでは、パブリックポインタfにローカル変数であるdのアドレスを割り当てます。終了するg.dh(); と、dのアドレスは無効になります。そのため、fの参照はg.dt();失敗します。

于 2012-04-26T22:31:44.043 に答える