如何在没有限制的情况下重新分配结构数组

时间:2018-01-18 19:58:50

标签: c++ arrays pointers structure dynamic-memory-allocation

基本上,我有一个动态分配的结构数组。

  using namespace std;
  struct library
  {
    string bookname;
    string author;
    int bookno;
  };
  int main()
  {
           library *lib=NULL;
           lib=malloc(sizeof(lib)*1);
           lib=(library*)realloc(lib,2);
           cout<<"Enter Book Name: "<<endl;
           getline(cin,lib[i]->bookname);
 }

在上面的程序中,我正在为库创建一个结构数组。我已经从1个空间重新分配到2个空格,可以增加到更多。但我在获取每个数组成员的成员变量的输入时遇到问题。 lib [i]在这里引起错误。

2 个答案:

答案 0 :(得分:1)

您的struct librarystd::string个成员,所以不是&#34; POD&#34; (普通数据)类。这意味着简单的C内存分配不起作用,因为不会调用字符串构造函数和析构函数。

做你想做的最简单的方法就是使用std::vector<library>。这将正确运行构造函数和析构函数,并将自动调整大小。如果您愿意,可以使用vectorreserve()手动控制shrink_to_fit()的分配大小。

如果你真的,真的必须使用malloc()和朋友,那么你需要使用placement new和手动析构函数调用。以下内容可能有效:

library *lib = nullptr;
lib = static_cast<library*>(malloc(sizeof(library)*2)); // note not sizeof(lib)
lib = new (lib) library[2]{}; // default construct an array of library at the given location
cout<<"Enter Book Name: "<<endl;
getline(cin,lib[0].bookname);
// ...do other library stuff...
lib[0].~library(); // destroy librarys
lib[1].~library();
free(lib); // deallocate storage

但请注意,您仍然无法使用realloc()。您必须创建一个新数组,使用placement new调用复制/移动构造函数,然后销毁并删除原始数组。

或者只使用std::vector,它会为您完成所有这些。

答案 1 :(得分:0)

仅仅看一下代码就有几个错误

  1. 您说明您的问题来自:lib[i]嗯,提供的代码段永远不会声明i
  2. lib是一个指针,当您使用带有指针的[]时,您引用它意味着->将无效,只需使用.,如下所示:{{ 1}}
  3. Tristan Brindle是正确的,您需要使用lib[i].bookname