C ++函数返回结构指针变得奇怪

时间:2012-09-28 01:36:55

标签: c++ function pointers struct return

我正在进行一项创建程序的作业,该程序可以使用链接列表从文本文件中读取多项式。当我试图从read_poly函数返回链表“poly_pointer”的起始指针时,这很奇怪。

预期输出应为-12

但我得到的是-10

如果我在read_poly

中返回之前添加一行代码

cout << curr_ptr->coef;

输出会突然变为2-12 任何人都可以解释为什么以及如何解决这个问题?

Polynomial.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

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

3 个答案:

答案 0 :(得分:2)

addNode返回指向本地分配的poly_node的指针。

以下是内存的草率分配,但会起作用。

  poly_pointer a = new poly_pointer();
  a->coef = coef;
  a->expon = expon;
  return a;

答案 1 :(得分:1)

poly_node a;
poly_pointer ptr = &a;
a.coef = coef;
a.expon = expon;
return ptr;

坏了!您返回了指向局部变量的指针。函数退出后使用该指针会触发未定义的行为。如果您想要返回一个超过函数生命周期的值,请使用mallocnew

答案 2 :(得分: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,那么请使用它们而不是原始指针。