1

我正在做一项任务,该任务要创建一个程序,该程序可以使用链表从文本文件中读取多项式。当我试图从 read_poly 函数返回链表“poly_pointer”的起始指针时,事情变得很奇怪。

预期输出应为 -12

但我得到的是-10

如果我在 read_poly 返回之前添加一行代码

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;
}

主文件

#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 回答