【问题标题】:Dynamically allocate an array of structs with C++使用 C++ 动态分配结构数组
【发布时间】:2015-02-06 04:06:00
【问题描述】:

我正在尝试动态分配记录数组。当我使用 ./a.out 运行我的程序时,它似乎工作正常,但是当我尝试运行从 .txt 文件 (./myProg

struct Book {
    char *title; //entered with no spaces
    int date; // in the form ddmmyy
};

Book *createRecord(int);
void input(Book *, int);
void display(Book *, int, int);
void destroyRecord(Book *);

int main() {
    int arrN = 0;
    int n = 0;

    cout << "Enter size of array: ";
    cin >> arrN;

    Book *bookArr;  
    bookArr = new Book[arrN];

    bookArr = createRecord(arrN);

    input(bookArr, arrN);

    cin.ignore();
    cout << "Book: ";
    cin >> n;

    display(bookArr, arrN, n);  
    destroyRecord(bookArr);

    return EXIT_SUCCESS; 
}


Book *createRecord(int arrN){
    struct Book *bookArr;
    bookArr = new Book[arrN];
    return bookArr;
}

void input(Book *bookArr, int arrN) {
    for(int i = 0; i < arrN; i++){
        char arrFirst[20];
        cin.ignore();
        cout << "Name: ";
        cin.getline(arrFirst, 20);
        strcpy((bookArr[i]).title = new char, arrFirst);
        cout << "Score: ";
        cin >> (bookArr[i]).date;
    }
}


void display(Book *bookArr, int arrN, int n) {
    if (0 <= n && n <= arrN){
        cout << (bookArr[n-1]).title << " " << (bookArr[n-1]).date << endl;
    }
}

void destroyRecord(Book *bookArr) {
   delete [] (bookArr)->title;
   delete bookArr;
}

【问题讨论】:

    标签: c++ arrays dynamic-memory-allocation records


    【解决方案1】:

    嗯,首先,您要分配两个数组:

    bookArr = new Book[arrN]; // <-- leaked
    bookArr = createRecord(arrN);
    

    这是内存泄漏。

    其次:

    (bookArr[i]).title = new char
    

    这是分配一个您尝试将整个字符串复制到其中的单个字符。那应该是:

    // two lines please!
    bookArr[i].title = new char[20];
    strcpy(bookArr[i].title, arrFirst);
    

    第三:

    if (0 <= n && n <= arrN){
    

    边界检查不正确。上限应该是n &lt; arrN,然后只是索引n。通过索引n - 1,您可以打印第-1 个索引。

    最后但并非最不重要的是,更喜欢:

    struct Book {
        std::string title;
        int date;
    }
    
    std::vector<Book> bookArr;
    

    【讨论】:

      【解决方案2】:

      问题1:

      修复显示函数中的数组索引问题:

      void display(Book *bookArr, int arrN, int n) {
          if (0 <= n && n <= arrN){
              cout << (bookArr[n - 1]).title << " " << (bookArr[n - 1]).date << endl;
          }
      }
      

      void display(Book *bookArr, int arrN, int n) {
          if (0 < n && n <= arrN){
              cout << (bookArr[n - 1]).title << " " << (bookArr[n - 1]).date << endl;
          }
      }
      

      n = 0bookArr[-1] 在你的代码中抛出错误。

      问题 2:

      将字符数组而不是单个字符分配给行中的标题,更改:

          strcpy((bookArr[i]).title = new char, arrFirst);
      

          strcpy((bookArr[i]).title = new char[20], arrFirst);
      

      【讨论】:

        【解决方案3】:

        不确定输入问题,但您肯定没有按照应有的方式创建数组。在您的代码中,您正在创建一个书籍数组,然后在 createRecord 函数中分配一个新的书籍数组并用它替换原始数组。与您预期的不同,您最终会得到一个未初始化的 Book 指针数组。

        这是你应该做的……

        // Allocate an array of books
        Book *bookArr; 
        bookArr = new Book[arrN];
        
        // Preallocate the records
        for ( int iBook = 0; iBool < arrN; iBook++ )
        {
          bookArr[ iBook ] = createRecord();
        }
        
        ...
        
        
        Book *createRecord()
        {
          // Allocate one new book
          struct Book *pbook = new book;
          return pbook;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-05-17
          • 2020-01-24
          • 2014-08-22
          • 1970-01-01
          • 2017-05-29
          • 2021-10-30
          • 2017-03-30
          相关资源
          最近更新 更多