Как преобразовать динамический массив в статический массив на c ?

#c #arrays #casting

#c #массивы #Кастинг

Вопрос:

Как в c преобразовать динамический массив в статический?

Скажите

У меня есть

 int ** da;
da = new int*[9];
for (int i=0; i<9; i  ) da[i] = new int[9];
  

и аргумент моей функции имеет тип
int[9][9] , как мне преобразовать da, чтобы моя функция могла его использовать?

Комментарии:

1. Какова спецификация вашей функции?

Ответ №1:

int[9][9] Это 81 целое число, расположенное последовательно в памяти, занимающее 81*sizeof(int) байты. int *[9] — это последовательность из 9 указателей на целое число, занимающая 9*sizeof(int *) байты. Каждый из них настроен так, чтобы указывать на 9 различных последовательностей по 9 целых чисел.

Вы не можете использовать один вместо другого — никакое приведение не изменит того, что эти два массива расположены в памяти совершенно по-разному.

Ответ №2:

вы этого не делаете — вы должны перемещать по мере необходимости, если функция сохраняет свою подпись. пример:

 void function(int a[9][9]);

int tmp[9][9];

// move to temp
for (size_t i(0); i < 9;   i) {
    for (size_t j(0); j < 9;   j) {
        tmp[i][j] = da[i][j];
    }
}

function(tmp);

// move to da
for (size_t i(0); i < 9;   i) {
    for (size_t j(0); j < 9;   j) {
        da[i][j] = tmp[i][j];
    }
}
  

причина: расположение и выравнивание 2D-массивов явно определены и определена реализация. реализация функции ожидает точного расположения и выравнивания. любой другой макет, очевидно, привел бы к ошибке.

even int tmp[9*9] не гарантированно совпадает с int tmp[9][9] .

к счастью, создание этого в стеке и копирование в / из обходится дешево.

Ответ №3:

Возможно, это не имеет отношения к этому вопросу. Но это напоминает мне трюк в matrix с использованием C. Хорошая часть в том, что нам нужно вызвать malloc и free только один раз. Плохая часть в том, что…..

 // create the buffer and assign the pointer array
int  i, j;
int* buffer = (int*) malloc(sizeof(int) * 81);

int* matrix[9]; // 9 * 9
for (i = 0; i < 9;   i)
    matrix[i] = buffer   i * 9;

// assign some value using matrix[i][j]
for (i = 0; i < 9;   i)
    for (j = 0; j < 9;   j)
        matrix[i][j] = (i   1) * (j   1);

// retrieve the value in matrix
for (i = 0; i < 9;   i)
    for (j = 0; j < 9;   j)
        std::cout << matrix[i][j] << " ";

std::cout << std::endl;

// free the buffer
free(buffer);