C ++指针帮助

时间:2010-01-29 16:56:27

标签: c++

    #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循环中的第一行,则该程序有效; “已被注释掉,但否则会崩溃

5 个答案:

答案 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 

希望这有帮助。