You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用nullptr动态分配结构体数组?C++新手技术求助

问题排查与修正

你的代码核心问题在于二级指针twoes没有分配内存就直接访问下标:

twoes被初始化为nullptr,它只是一个空指针,没有指向任何有效的指针数组空间。直接执行twoes[i] = nullptr相当于往空指针指向的内存区域写数据,这会触发未定义行为(程序直接崩溃,所以永远到不了cout<<"i dont get HERE"这一行)。

修正步骤

  1. 先给指针数组分配内存:在第一个for循环前,先为twoes申请能存放5个ones*的空间。
  2. 初始化每个元素为nullptr:这时候访问twoes[i]才是合法的。
  3. 记得释放内存:避免内存泄漏,程序结束前要依次释放每个结构体,再释放指针数组本身。

修正后的完整代码

#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,提问作者Деян Цонев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:45:35