Указатели и двумерный массив

Рейтинг: 2Ответов: 1Опубликовано: 13.03.2015

Код:

class Forest
{
public:
    char name[255];
    int height, age;
};

int main()
{
    int n = 2;
    Forest **test = new Forest*[n];
    for(int i = 0; i < n; ++i)
        test[i] = new Forest;
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < 2; ++j)
        {
            printf("Wood name: ");
            fflush(stdin);
            gets((*(*(test+i)+j)).name);
            printf("Wood age: ");
            scanf("%d", &(*(*(test+i)+j)).age);
            printf("Height wood: ");
            scanf("%d", &(*(*(test+i)+j)).height);
            printf("========================\n");
        }
    }
    printf("View data:\n\n");
    for(int i = 0; i < n; ++i )
    {
        for(int j = 0; j < 2; ++j )
        {
            printf("Wood name: %s\n", test[i][j].name);
            printf("Wood age: %d\n", test[i][j].age);
            printf("Height wood: %d\n", test[i][j].height);
            printf("========================\n");
        }
    }
    for(int i = 0; i < n; ++i )
        delete test[i];
    delete []test;
    getch();
    return 0;
}

В VS 2010 возникает ошибка: "Обнаружено повреждение кучи". Как в данном случае правильно обращаться к элементам двумерного массива?

Ответы

▲ 1

У меня есть два варианта интерпретации вашего кода. Если вы хотите создать двумерный массив объектов типа Forest, тогда нужно написать test[i] = new Forest[2]; ну и соответственно delete[] test[i];. Если же вы хотите создать массив указателей на объект типа Forest, тогда нужно убрать все внутренние циклы с j и все случаи использования этой переменной — например: gets((*(*(test+i))).name);.

Непонятно также, зачем вы используете конструкции вроде (*(*(test+i)+j)).name. Неужели нельзя написать test[i][j].name? И если вы ввели константу n, то в последнем цикле тоже стоит её использовать.