【问题标题】:Function: an Array of a Struct函数:结构体数组
【发布时间】:2017-07-27 15:27:09
【问题描述】:

我正在尝试编写一个返回 C++ 结构数组的函数。我似乎能够从输入文件中填充数组。但是,我在返回结构数组时遇到了分段错误。我错过了什么吗?

Coordinates* GetCoordinates(string Input) {
        Coordinates* coor_array = new Coordinates[1000];
        int k = -1;

        string line;

        ifstream file;
        file.open(Input.c_str());

        while (!file.eof()){
                getline(file,line);
                k++;
                char** holder = split (line,' ');
                coor_array[k].element = holder[0];
                coor_array[k].x = atof(holder[1]);
                coor_array[k].y = atof(holder[2]);
                coor_array[k].z = atof(holder[3]);

                cout << "Atom:" << coor_array[k].element  << " X:" << coor_array[k].x << " Y:" << coor_array[k].y << " Z:" << coor_array[k].z <<endl;

        }
        return coor_array;
}

虽然我的结构定义如下:

struct Coordinates
{
        string element;
        double x,y,z;
};

我使用以下代码来调用我的函数:

Coordinates* coor_data = GetCoordinates(Input);

运行时出现以下错误:

 Atom:H X:26.4706 Y:30.0098 Z:64.4696
 Atom:O X:25.8063 Y:28.7746 Z:64.7809
 Atom:H X:25.6821 Y:30.626 Z:63.3106
 Segmentation fault

谁能提出可能是什么问题?

【问题讨论】:

  • 不要。使用std::vector(如果大小未知)或std::array(如果大小已知)。另见:stackoverflow.com/questions/5605125/…
  • 您在我们看不到的代码中遇到了问题(可能是split)。这就是我们要求minimal reproducible example 的原因。我的猜测是您对来自split 的返回值管理不善。
  • 我添加了在 main 中调用函数的方式,这可能会补全缺失的代码。我认为拆分不是问题,因为我已经彻底测试过。
  • @Rubber_duck 我建议逐行遍历您的代码,以找到错误的确切来源。除此之外,请遵循 Nathan 和 UKMonkey 的建议。

标签: c++ arrays struct


【解决方案1】:

使用 for 循环解决了问题:

for(string line; getline(file,line);){

}

在阅读了@NathanOliver 推荐的那些页面之后,我仍然不太清楚为什么 eof 是一个坏主意。从我收集到的信息来看,是不是因为 eof 试图读取下一行,而不管它可能是最后一行吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多