如何填充包含指针数组的struct数组

时间:2018-06-13 17:24:44

标签: c++ arrays pointers data-structures struct

我在C ++中有一个小而简单的问题。我想填充包含双数组的struct数组。我怎样才能做到这一点?

typedef struct 
{
    double *inputs[2];
    double *target[1];
} Data;

Data data[] 
{
    new double[2]{10, 20}, new double[1]{30},
    new double[2]{40, 50}, new double[1]{60},
    new double[2]{70, 80}, new double[1]{90},
    new double[2]{100, 110}, new double[1]{120} 
};

main()

printf("data[0]: inputs: %f %f, targets: %f\n",
                   *data[0].inputs[0],
                   *data[0].inputs[1],
                   *data[0].target[0]);

这是我的想法,但是当我运行它时会打印出来:

data[0]: inputs: 10.000000 30.000000, targets: 40.000000

当然,在数组数据的末尾(如第3或第4项),它将导致UNAUTHORIZED ACCESS TO MEMORY

感谢您的想法和耐心;)

3 个答案:

答案 0 :(得分:3)

使用现代c ++可以使您的代码更简单,更安全:

#include <iostream>
#include <array>
#include <vector>

struct Data {
    std::array<double,2> inputs;
    std::array<double,1> target;
};

int main()
{
    std::vector<Data> data = {
        { {10, 20}, {30} },
        { {40, 50}, {60} },
        { {70, 80}, {90} },
        { {100, 110}, {120} }
    };
    std::cout << "data[0]: inputs: " << data[0].inputs[0] << " " << data[0].inputs[1] << ", targets: " << data[0].target[0] << "\n";
}

你原来的问题是double *inputs[2]声明了一个指向double的2元素指针数组,而不是指向doubles的2元素数组的指针。

答案 1 :(得分:1)

您的Data结构包含2个字段,2个double指针数组和1个double指针数组。

这意味着初始化它需要3个double指针,这意味着你的初始化真的看起来像这样

Data data[]{
{new double[2]{ 10, 20 },   new double[1]{ 30 },        new double[2]{ 40, 50 }}, //1st object
{new double[1]{ 60 },       new double[2]{ 70, 80 },    new double[1]{ 90 }}, //2nd object
{new double[2]{ 100, 110 }, new double[1]{ 120 }} //3rd object but 2 parameters??
};

当尝试在循环中打印时,第3个对象将导致段错误,因为target字段未正确初始化(使用Visual Studio进行调试时,它设置为null,而不是确定其他编译器。)

答案 2 :(得分:1)

你的问题在这里:

typedef struct {
    double *inputs[2];  // this
    double *target[1];  // this
} Data;

这是一个指针数组,希望假设它是一个动态的一维数组。 简单的解决方法是:

struct Data {
    double *inputs = nullptr;
    double *target = nullptr;
} ;

但是,使用new进行了大量的堆内存分配,这使delete执行繁琐的任务,从而导致数据结构的管理变得非常困难。 我强烈建议您使用std::vector<>,这样可以使您的任务更轻松,更清洁。

#include <vector>
#include <iostream>

struct Data
{
   std::vector<double> inputs; // use  instead of double *inputs[2];
   std::vector<double> target; // use  instead of double *target[1];
   //Data(const std::vector<double>& a, const std::vector<double>& b) :inputs(a), target(b){}
};

int main()
{
   std::vector<Data> data = // now in your main structure array
   {  { {10, 20}, {30} },
      { {40, 50}, {60} },
      { {70, 80}, {90} },
      { {100, 110},{120} }
   };
   // access using range based loop now
   for(const Data& each_strcut: data)
      std::cout << each_strcut.inputs[0] << " " << each_strcut.inputs[1]
                <<"\t" << each_strcut.target[0] << std::endl;
   return 0;
}