用C++动态分配一个结构数组

Dynamically allocate an array of structs with C++

本文关键字:一个 结构 数组 C++ 动态分配      更新时间:2023-10-16

我正在尝试动态分配一个记录数组。当我使用运行程序时/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;
}

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

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 < arrN,然后只是索引n。通过索引n - 1,您可以打印第一个索引。

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

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

问题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 = 0时,bookArr[-1]在您的代码中抛出错误。

问题2:

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

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

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

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

这是你应该做的。。。

// 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;
}
相关文章: