用C++动态分配一个结构数组
Dynamically allocate an array of structs with C++
我正在尝试动态分配一个记录数组。当我使用运行程序时/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;
}
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 如何将数据从一个结构链接到另一个结构
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- std::transform 将一个结构数组复制到另一个结构数组
- 输入 ctrl + x 后如何再次 cin (cin<<x) 循环(cin 一个结构)
- 如何在级别上打印树,给定一个结构,该结构保存节点的值及其父节点的值,对于树中的每个节点
- 创建一个结构的关联数组,以创建一个缓冲区,供键快速访问
- 如何在另一个结构中初始化结构数组?
- 在另一个结构中声明内部结构会导致错误:结构使用无效
- 我想重置一个C++结构统计,我可以以某种方式使用 stat() 语法吗?
- C++可以输出一个结构的内存地址吗
- 通过 C++ 中的另一个结构成员访问结构
- C++ push_back() 一个结构体到一个向量中
- 难以从另一个结构中的函数返回结构
- 如何将向量添加到结构中以创建一个库存系统,在该系统中,我可以仅使用一个结构向系统添加多种不同的葡萄酒
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- 将一个结构的值复制到另一个结构
- 是否可以在同一未创建的结构内创建一个结构