0

我有两个结构 ITEM 和 TABLE,其中一个包含另一个,即 TABLE 包含许多项目。我使用此代码来创建结构和表和项目。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

struct ITEM {
 std::string itemTitle;
};

struct TABLE {
 std::string tableName;
 int num;
 ITEM* items;
};

TABLE setTABLE(std::string, int num) {
 struct ITEM* item = (struct ITEM*) malloc(sizeof(struct ITEM) * num);
 TABLE table = {tableName, num, item};
 return table;
}

int main() {
 std::vector<TABLE> tables;
 tables.push_back(setTABLE("TEST", 3));
 tables[0].items[0].itemTitle = "TestItem";
 std::cout << tables[0].items[0].itemTitle << "\n";

 return 0;
}

我想将 ITEM 的 itemTitle 设置在位置 0,但是当我计算出结果时,我得到了

Segmentation fault: 11

我猜 malloc 还不够吗?还是我的代码结构一开始就被误解了?我想要实现的是构建一个自定义的表结构。

4

2 回答 2

2

malloc()分配内存,而new分配内存初始化(例如调用对象的构造函数)。malloc()正在使用items的是指向已分配但未初始化的内存的指针,可在以下位置访问:

tables[0].items[0].itemTitle = "TestItem";

导致分段错误。但是,不要new只使用 astd::vector<ITEM>代替。初始大小不是必需的,但可以在需要时提供,并使用默认元素vector构造:n

struct Table
{
    Table(std::string const& aName, const size_t a_num) :
        tableName(aName), items(a_num) {}
    std::string tableName;
    std::vector<Item> items;
};

注意num不再需要,因为items.size()可以使用并且不要全部使用大写,因为这些通常用于宏。

于 2013-05-18T09:06:36.310 回答
0

您正在返回在堆栈上创建的变量——您首先table需要malloc记忆table

于 2013-05-18T09:00:48.047 回答