0

次の C++ コードの問題点を知りたいです。実行時にクラッシュします。

#include <iostream.h>
#include <conio.h>
using namespace std;

class node
{
    public:
        int info;
        node *addr;

        node(){
            info = 0;
            addr = NULL;          
        }

        ~node(){}
};

void func(node *);


int main(void){   
    node *head;
    node b;

    b.info = 10;

    *head = b;

    func(head); 
    getch();
}

void func(node *obj){
    cout<<"i: "<<(*obj).info;
}
4

6 に答える 6

4
*head = b;

head は何も指していないので不正解です

head = &b ;

問題を解決する必要があります

于 2012-10-23T05:18:39.827 に答える
1

問題は

*head = b;

に置き換えます

head = &b ;
于 2012-10-23T08:41:25.427 に答える
0

のアドレスをポインタに割り当てたいと仮定すると、*head = b;代わりに行はになります。head = &b;bhead

不正なバージョンはコンパイルされますが、初期化されていないポインタbに含まれているアドレスにオブジェクトのコピーが割り当てられます。

于 2012-10-23T05:20:59.167 に答える
0

間違っていることの 1 つは、ここでポインターを宣言したことです。

node *head;

そして、ここでそれを使用しました:

 *head = b;

にメモリを割り当てずにhead

于 2012-10-23T05:16:45.457 に答える
0

2 つの問題があります。

  1. 初期化されていないポインタを参照しています *head

  2. スタック変数をポインターに格納します。

私は(他の人たちと同じように)*head = b あなたが本当に本気で言っていると思いますhead = &b. 最初のケースでは、ノード ポインターを参照し、その上にノード値を割り当てます。変数が初期化されていないため、これはエラーですhead。そのため、無効なメモリ アドレスの上に完全なノード値をコピーしています。

を に置き換えると、ポインターが のアドレスにhead = &b設定されるため、多少改善されます。しかし、スタック変数であるため、他のエラーが発生しました。そこにあるポインターは、関数の有効期間中にのみ有効です。関数が終了するとすぐに、スタック スペースが再利用され、ポインターはそこにあるものを破壊します。headbbhead

典型的な解決策はhead、ノードへのポインターとして保持することですが、ノードへのポインターにも変更し、やbなどのヒープ メモリ割り当てで初期化します。次に、何でも格納でき、最後に、 のような長寿命の変数へのポインタを格納します。b = (node *)malloc(sizeof(node);b = new node;*bheap=b;

于 2012-10-23T05:34:12.540 に答える
0

他の人が任意メモリへの書き込みの問題に答えていますが、次のような他のことに集中したいと思います。

#include <iostream.h>
#include <conio.h>

これの問題点は、かなり古いコンパイラを使用していることです。C++ ヘッダーはもはや存在せず.h、非常にconio.h非標準で古くなっています。

最初に、より新しい環境に更新することをお勧めします。

さらに、オブジェクト指向の基礎の 1 つは、オブジェクトが自身のアクションに責任を持つということです。コードがオブジェクトの内部にアクセスしてメンバーに直接アクセスすることは、ほとんど良い考えではありません。

適切なゲッターとセッターを提供し、通常、クラス内の唯一のパブリックなものがデータではなく関数であることを確認する必要があります。

つまり、次のようなものです。

class node {
    public:
        node () {
            info = 0;
            addr = NULL;          
        }

        ~node() {
        }

        int getInfo() {
            return info;
        }
        void setInfo (int newInfo) {
            // Check newInfo for validity first.
            info = newInfo;
        }

        node *getAddr() {
            return addr;
        }
        void setAddr (node *newAddr) {
            // Check newAddr for validity first.
            addr = newAddr;
        }

    private:
        int info;
        node *addr;

};
于 2012-10-23T05:26:56.363 に答える