Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指向Struct的函数返回指针异常_C++_Function_Pointers_Struct_Return - Fatal编程技术网

C++ C++;指向Struct的函数返回指针异常

C++ C++;指向Struct的函数返回指针异常,c++,function,pointers,struct,return,C++,Function,Pointers,Struct,Return,我正在做一个作业,创建一个程序,可以使用链表从文本文件中读取多项式。当我试图从read_poly函数返回链表“poly_pointer”的起始指针时,事情变得很奇怪 预期输出应为-12 但我得到的是-10 如果我在返回read_poly之前添加一行代码 cout << curr_ptr->coef; 多项式 #include <iostream> #include <fstream> #include <string> #inclu

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

预期输出应为-12

但我得到的是-10

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

cout << curr_ptr->coef;

多项式

#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;
}
#包括
#包括
#包括
#包括“多项式.h”
使用名称空间std;
多边形指针addNode(int coef,int expon)
{
poly_节点a;
多边形指针ptr=&a;
a、 coef=coef;
a、 expon=expon;
返回ptr;
}
多边形指针读取多边形(常量字符*文件名)
{
多指针启动ptr,当前ptr;
start_ptr=curr_ptr=addNode(-1,6);
curr\u ptr=curr\u ptr->link=addNode(2,3);
返回启动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;
}
#包括
#包括“多项式.h”
使用名称空间std;
内部主(空)
{
多边形指针a、b、d、e、f;
a=读取多边形(“input1.txt”);
库特系数;
cout-link->coef;
库特

糟糕!您返回了一个指向局部变量的指针。在函数退出后使用该指针会触发未定义的行为。如果要返回一个在函数生命周期结束后仍然存在的值,请使用
malloc
new

addNode返回指向本地分配的poly_节点的指针

下面是松散的内存分配,但会起作用

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

只需按值返回即可。对于您拥有的结构,这很好

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\u ptr或std::shared\u指针,那么请使用它们而不是原始指针。

\u多项式\u H\u
违反了保留标识符的规则:。您还应该不惜一切代价避免在头文件的全局范围内使用命名空间std;
。至于您的问题,quest中的代码对于MaloC,答案看起来都是C风格的代码,而不是C++。谢谢你,我想我理解你在说什么。但是我应该怎么处理我的代码才能使它正常工作?对不起,我对指针的东西很陌生。@ HehanTaI,一个智能指针不会泄漏给你,你可以轻松地传递它。C++ 03只是有<代码】。>auto_ptr,在C++11中被三个不同的指针替换。更简单的方法可能是根本不使用指针,让NRVO做它的事情。thx,但我得到了一个类似于1>多项式.cpp(9)的错误:错误C2440:“初始化”:无法从“poly_-pointer*”转换为“poly_-pointer”。抱歉,我在那里混合了表示法。使用新的poly_节点。在表示法上,使用typedef指针类型会使某些方面更加混乱,至少对我来说是这样。您可以坚持在代码中仅使用poly_-pointer*类型。不过其他注释并不错误。这是如果以后不删除指针,实现可能会泄漏。这是可行的,但要继续学习指针。嗯……指针意义上的泄漏到底是什么?我应该怎么做才能删除指针?我应该删除指针和main()的结尾吗?
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;
}