2016-09-19 63 views
1

我定义了一个结构并想初始化该结构的数组。该程序执行并写入值到控制台,但然后崩溃,我不知道为什么,因为它不给我任何错误信息。我相信我的错误是当我尝试将结构赋值给程序时,程序正常工作,但我无法弄清楚我做错了什么。我希望有人能帮助我。尝试将结构指针指向某个结构时程序崩溃

struct Item{ 
    char *key; 
    char *val; 
}; 


int main() { 
    char k[] = "key"; 
    char v[] = "value"; 

    struct Item **dict = new struct Item*[3]; 
    dict[0]->key = k; 
    dict[0]->val = v; 

    cout << dict[0]->key << " "<< dict[0]->val << "\n"; 
    delete[] dict; 
} 

回答

4

通过这样做:

struct Item **dict = new struct Item*[3]; 

您创建指针数组的指针struct Item注意:在C++中,您不需要struct资格来声明struct对象。

创建的指针还没有引用任何有效的对象,因此取消引用它们会产生未定义的行为。那么,在您初始分配后,您可能想要遍历每个指针数组并创建该元素。例如:

for(int i = 0; i < 3; i++){ 
    dict[i] = new Item[4]; //as an array, or 
    //dict[i] - new Item(); 
} 

保存自己所有的头痛和使用std::vector,并且还使用std::string太而非char*


今天的雷区,在C++中,这是你想要做什么:

struct Item{ 
    std::string key; 
    std::string val; 
}; 


int main() { 
    std::string k = "key"; 
    std::string v = "value"; 

    //auto dict = std::make_unique<Item[]>(3);  
    std::vector<Item> dict(3); 
    dict[0].key = k; 
    dict[0].val = v; 

    std::cout << dict[0].key << " "<< dict[0].val << "\n"; 
} 

同样地,如果你的目的是键/值的地图,你可以简单地使用std::map由MM的建议,或std::unordered_map

+0

伟大的答案谢谢你完美的作品 – moonboon

+0

使用'std :: map'可能是一个更好的“现代C++”等价物 –