分配指向结构的动态指针数组

Allocate a dynamic array of pointers to the structure

我已经创建了动态数组

struct Student{
    string name;
    string dateOfBirth;
};

Student **students = new Student*[5]

但是当我尝试存储数据时出现错误

抛出异常:读取访问冲突。 这是 0xCDCDCDCD。

(*students[iterator]).name = name;

如果你想这样分配内存:

struct Student{
    string name;
    string dateOfBirth;
};

Student **students = new Student*[5];

正如评论所说,你需要考虑 students[0] 的数据类型到底是什么。在本例中,它是 Student *,这意味着您必须这样对待它。如果您尝试通过执行以下操作直接为其分配一个值,您将遇到各种内存错误(希望编译器 errors/warnings)

Student **students = new Student*[5];

students[0] = Student{"Bob", "1st Jan 1970"}; // Nope
*students[0] = Student{"Bill", "1st Jan 1970"}; // Also no

第一个显然行不通,因为我们试图将 Student 分配给 Student *,这是不可能的。第二个不起作用的原因与内存分配的工作方式有关。

当您调用 Student **students = new Student*[5] 时,您是在告诉编译器为 5 个 Student * 对象分配内存,这些对象最终都是 64 位无符号整数。这意味着这些 64x5 位有可用内存,但请记住,它们是指针,因此它们需要指向某个地方。

赋值的方式如下:

students[0] = new Student{"Barry", "1st Jan 1970"}; // (Notice the 'new')

这将为新的 Student 动态分配内存,并设置 students 中的指针指向它,允许您访问它。


========警告========

当您动态分配内存时(即使用 newmalloc 等),您负责调用 delete[]deletefree ,视情况而定。如果没有这些调用,内存将永远不会被释放,最终会出现内存泄漏,这可能会带来很大的问题。使用指向指针的指针的困难在于您需要在释放主指针之前释放每个 sub-pointer 。尝试以相反的方式去做会导致其他有趣的问题,你最好不要经历这些问题。

希望这对您有所帮助。让我知道是否可以清理任何东西或者它是否不起作用...