#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);