如何用nullptr动态分配结构体数组?C++新手技术求助
问题排查与修正
你的代码核心问题在于二级指针twoes没有分配内存就直接访问下标:
twoes被初始化为nullptr,它只是一个空指针,没有指向任何有效的指针数组空间。直接执行twoes[i] = nullptr相当于往空指针指向的内存区域写数据,这会触发未定义行为(程序直接崩溃,所以永远到不了cout<<"i dont get HERE"这一行)。
修正步骤
- 先给指针数组分配内存:在第一个for循环前,先为
twoes申请能存放5个ones*的空间。 - 初始化每个元素为nullptr:这时候访问
twoes[i]才是合法的。 - 记得释放内存:避免内存泄漏,程序结束前要依次释放每个结构体,再释放指针数组本身。
修正后的完整代码
#include <iostream> using namespace std; typedef struct ones { int a; int b; } ones; ones** twoes = nullptr; int main() { cout << "Hello World" << endl; // 第一步:先分配指针数组的内存 twoes = new ones*[5]; // 现在可以安全初始化每个元素为nullptr了 for(int i = 0; i < 5; i++) { twoes[i] = nullptr; } cout << "i get HERE now!" << endl; for(int i = 0; i < 5; i++) { twoes[i] = new ones; twoes[i]->a = 2; cout << twoes[i]->a << endl; } // 释放内存:先释放每个结构体 for(int i = 0; i < 5; i++) { delete twoes[i]; } // 再释放指针数组本身 delete[] twoes; return 0; }
额外建议
如果是C++新手,更推荐使用标准库的std::vector来替代手动管理动态数组,它会自动处理内存分配和释放,更安全也更简洁:
#include <iostream> #include <vector> using namespace std; struct ones { int a; int b; }; int main() { cout << "Hello World" << endl; // 直接创建一个存放ones指针的vector,初始大小5,每个元素是nullptr vector<ones*> twoes(5, nullptr); cout << "i get HERE now!" << endl; for(int i = 0; i < 5; i++) { twoes[i] = new ones; twoes[i]->a = 2; cout << twoes[i]->a << endl; } // 释放每个结构体 for(auto ptr : twoes) { delete ptr; } return 0; }
(注:C++11及以后支持范围for循环,如果你用旧标准,改成普通for循环即可)
内容的提问来源于stack exchange,提问作者Деян Цонев
相关产品推荐
相关产品推荐

