#include <iostream>
using namespace std;
struct InvRec
{
int PartID;
float Price;
int Warehouse;
};
typedef InvRec *InvRecptr;
typedef InvRec arr[];
typedef InvRecptr * indexarr;
void deallocate (indexarr & ptrs, int & size)
{
for (int i=0; i<size; i++) delete (ptrs[i]);
delete ptrs;
ptrs = NULL;
size = 0;
};
int getRecordCount();
void main ()
{
char YN;
cout << "press a key, at creation";
cin >> YN;
InvRecptr *InvRecArray = new InvRecptr[10];
for (int i = 0; i < 10; i++)
{
InvRecArray[i]->PartID = i;
cout << "\n i = " << i << "\n";
}
};
如果主循环“In RecArray [i] - &gt; PartID = i;的for循环中的第一行,则该程序有效; “已被注释掉,但否则会崩溃
答案 0 :(得分:5)
该行:
InvRecptr *InvRecArray = new InvRecptr[10];
分配指针数组。但是,指针不是自己分配的。因此,您需要这样的循环来分配指针:
for (int i = 0; i < 10; i++)
{
InvRecArray[i] = new InvRec;
// Initialize members of InvRecArray[i]
}
答案 1 :(得分:4)
您还需要分配指针所指向的内存。
答案 2 :(得分:1)
执行typedef InvRec *InvRecptr;
和InvRecptr *InvRecArray = new InvRecptr[10];
时,您将在堆上分配一个指针数组。必须将这些指针设置为引用现有的InvRec
。
尝试InvRec *InvRecArray = new InvRec[10];
并改用InvRecArray[i].PartID
。这将分配一个连续的InvRec
s。
答案 3 :(得分:0)
我相信这是因为InvRecArray被声明为InvRecPtr *,它等同于指向指针数组的指针 - 然后你试图在数组中的一个值上设置一个成员,但是你还没有预先创建该元素 - 因此,您最有可能尝试取消引用一个古怪的内存地址 - 或者至少一个肯定不指向有效对象的地址。
答案 4 :(得分:0)
其他答案似乎错过了一点: 声明/初始化与使用不匹配。
您声明并初始化一个对象数组。 然后尝试将其用作指向对象的指针数组。
如果您继续使用,则需要按如下方式声明和初始化:
InvRecptr **InvRecArray = new InvRecptr*[10]; // Note the double-asterisk
for (int i = 0; i < 10; i++)
{
InvRecArray[i] = new InvRecArray; // and the initialization
InvRecArray[i]->PartID = i;
...
}
或者,您可以删除一层间接,在这种情况下,声明/初始化保持不变,并且赋值更改为
InvRecArray[i].PartID = i; // Note the dot operator instead of arrow
希望这有帮助。