Выделение во время выполнения многомерного массива - PullRequest
0 голосов
/ 31 июля 2010

Пока я думал, что следующий синтаксис недействителен,

int B[ydim][xdim];

Но сегодня я попробовал, и это сработало! Я запускал его много раз, чтобы убедиться, что он не сработал случайно, даже valgrind не сообщал о segfault или утечках памяти !! Я очень удивлен Это новая функция, представленная в g ++? Я всегда использовал одномерные массивы для хранения матриц, индексируя их с правильными шагами, как это было сделано с A в программе ниже. Но этот новый метод, как и в случае с B, настолько прост и элегантен, что я всегда хотел. Это действительно безопасно для использования? Смотрите пример программы.

PS. Я собираю его с g ++ - 4.4.3, если это имеет значение.

#include <cstdlib>
#include <iostream>

int test(int ydim, int xdim) {
// Allocate 1D array
    int *A = new int[xdim*ydim](); // with C++ new operator
    // int *A = (int *) malloc(xdim*ydim * sizeof(int)); // or with C style malloc
    if (A == NULL)
        return EXIT_FAILURE;

// Declare a 2D array of variable size
    int B[ydim][xdim];

// populate matrices A and B
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++) {
            A[y*xdim + x] = y*xdim + x;
            B[y][x] = y*xdim + x;
        }
    }

// read out matrix A
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++)
            std::cout << A[y*xdim + x] << " ";
        std::cout << std::endl;
    }
    std::cout << std::endl;

// read out matrix B
    for(int y = 0; y < ydim; y++) {
        for(int x = 0; x < xdim; x++)
            std::cout << B[y][x] << " ";
        std::cout << std::endl;
    }

    delete []A;
    // free(A); // or in C style
    return EXIT_SUCCESS;
}


int main() {
    return test(5, 8);
}

Ответы [ 2 ]

1 голос
/ 31 июля 2010

int b[ydim][xdim] объявляет двумерный массив в стеке .new, с другой стороны, выделяет массив в куче .

Для любого нетривиального размера массива почти наверняка лучше иметь его в куче, чтобы вы не запустилисамостоятельно из стекового пространства или если вы хотите передать массив обратно во что-то за пределами текущей области.

1 голос
/ 31 июля 2010

Это C99 'массив переменной длины' или VLA. Если они поддерживаются и g ++, то я считаю, что это расширение стандарта C ++.

Хорошо, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...