与main.cpp以外的文件中定义的结构的奇怪性

Joh*_*nes 2 c++ struct

我发现在一个单独的Cpp文件中定义了一个结构(带有一个双精度数组和一个整数数组),但是从main调用的结果将不合理的值发送给cout用于数组.下面我希望是最小的例子,以及控制台输出.

我的道歉应该是我的代码被扰乱 - 我一直在努力格式化它.

如果有人能帮助我理解并纠正这一点,我将不胜感激.

最好,乔

(1)main.cpp:

#include "iostream"
#include "defs.h"

using namespace std;

int main()
{
    MyStruct myModel=ConstructModel();

    cout << endl << "myModel goes first:" << endl;
    for(int i=0; i<myModel.n; i++)
        cout << "myModel.Y[" << i << "]=" << myModel.Y[i] << endl;
    cout << "myModel.n=" << myModel.n << endl;

    MyStruct myOtherModel;
    myOtherModel.n=2; double Y[2]={0.1,0.1};
    myOtherModel.Y=Y;

    cout << endl << "now myOtherModel:" << endl;
    for(int i=0; i<myModel.n; i++)
        cout << "myOtherModel.Y[" << i << "]=" << myOtherModel.Y[i] << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(2)defs.cpp:

#include "defs.h"

MyStruct ConstructModel()
{
 MyStruct Model;

 double Y[2]={0.1,0.1}; Model.Y=Y;
    int n=2; Model.n=n;

    return Model;
}
Run Code Online (Sandbox Code Playgroud)

(3)defs.h:

#ifndef DEFS_H  
#define DEFS_H

struct MyStruct
{
    double *Y;//length (n+1)
    int n;
};

MyStruct ConstructModel();

#endif
Run Code Online (Sandbox Code Playgroud)

控制台输出

在我的机器上(WinXP 32bit,MSVC2008),这给出了:

myModel排在第一位:

myModel.Y [0] = 1.12947e-307

myModel.Y [1] = 1.80243e-307

myModel.n = 2

现在myOtherModel:

myOtherModel.Y [0] = 0.1

myOtherModel.Y [1] = 0.1

Pon*_*gge 10

你的struct包含一个指向双精度的裸指针.在defs.cpp中,您将其初始化为局部变量.超出范围ConstructModel(),该内存不再有效.

如果你想在一个结构中使用一个数组,你必须声明它(包括它的大小,然后必须对所有MyStructs 都相同).但是,为什么不使用eg std::list<double>std::vector<double>?而不是使用数组?