C ++函数返回指向struct去怪异(C++ Function Return Pointer to

2019-10-17 06:53发布

我工作的一个任务要创建一个程序,可以使用链接列表的文本文件中读取一个多项式。 这当我试图从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;
}

Answer 1:

ADDNODE返回一个指针到本地分配poly_node。

以下是内存马虎分配,而是将工作。

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


Answer 2:

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

坏! 你返回一个指向一个局部变量。 使用该指针函数退出之后触发未定义行为。 使用mallocnew来代替,如果你想返回生活在过去的功能的终身价值。



Answer 3:

仅仅通过值返回。 罚款,你有结构。

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,然后用它们来代替原始指针。



文章来源: C++ Function Return Pointer to Struct Goes Weird