我正在进行一项创建程序的作业,该程序可以使用链接列表从文本文件中读取多项式。当我试图从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;
}
答案 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;
坏了!您返回了指向局部变量的指针。函数退出后使用该指针会触发未定义的行为。如果您想要返回一个超过函数生命周期的值,请使用malloc
或new
。
答案 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,那么请使用它们而不是原始指针。