1

リンクリストを使用してテキストファイルから多項式を読み取ることができるプログラムを作成する課題に取り組んでいます。リンクされたリスト「poly_pointer」の開始ポインターを read_poly 関数から返そうとしたとき、どれが奇妙でしたか。

予想される出力は -12 である必要があります

しかし、私が得たのは-10です

そして、read_poly で return の直前に 1 行のコードを追加すると、

cout << curr_ptr->coef;

出力は突然 2-12 に変わります。この問題を解決する理由と方法について誰か説明してもらえますか?

多項式.h

#ifndef _POLYNOMIAL_H_
#define _POLYNOMIAL_H_

using namespace std;

typedef struct poly_node *poly_pointer;

typedef struct poly_node {
  int coef;
  int expon;
  poly_pointer link;
};

poly_pointer addNode(int coef, int expon);

#endif

多項式.cpp

#include <iostream>
#include <fstream>
#include <string>
#include "Polynomial.h"
using namespace std;

poly_pointer addNode(int coef, int expon)
{
    poly_node a;
    poly_pointer ptr = &a;
    a.coef = coef;
    a.expon = expon;
    return ptr;
}

poly_pointer read_poly(const char* fileName)
{
    poly_pointer start_ptr, curr_ptr;
    start_ptr = curr_ptr = addNode(-1, 6);
    curr_ptr = curr_ptr->link = addNode(2, 3);
    return start_ptr;
}

main.cpp

#include <iostream>
#include "Polynomial.h"
using namespace std;

int main(void)
{
    poly_pointer a, b, d, e, f;
    a = read_poly("input1.txt");
    cout << a->coef;
    cout << a->link->coef;

    cout << "\n-eop-";
    cin.get();
    return 0;
}
4

3 に答える 3

2

addNode は、ローカルに割り当てられた poly_node へのポインターを返しています。

以下は、ずさんなメモリ割り当てですが、動作します。

  poly_pointer a = new poly_pointer();
  a->coef = coef;
  a->expon = expon;
  return a;
于 2012-09-28T01:48:37.683 に答える
1
poly_node a;
poly_pointer ptr = &a;
a.coef = coef;
a.expon = expon;
return ptr;

悪い!ローカル変数へのポインタを返しました。関数の終了後にそのポインターを使用すると、未定義の動作がトリガーされます。関数の存続期間を過ぎても存続する値を返したい場合は、代わりにmallocorを使用します。new

于 2012-09-28T01:42:38.953 に答える
0

値で返すだけです。あなたが持っている構造体には問題ありません。

poly_node addNode(int coef, int expon)
{
    poly_node a;
    a.coef = coef;
    a.expon = expon;
    return a;
}

型が大きい場合は、ヒープにメモリを割り当ててポインターを返します。メモリを解放する所有権は、メソッドの呼び出し元にあります。

poly_pointer addNode(int coef, int expon)
{
    poly_pointer a = new poly_node();
    a->coef = coef;
    a->expon = expon;
    return a;
}

std::unique_ptr または std::shared_pointer をサポートするコンパイラがある場合は、生のポインターの代わりにそれらを使用します。

于 2012-09-28T01:59:26.017 に答える