Вопрос помечен C ++, но в ответах используется только подмножество C ...
Ну, во-первых, я бы рекомендовал против всего этого.Создайте класс, который инкапсулирует вашу матрицу, и разместите его в одном блоке, предложите operator()(int,int)
, чтобы получить доступ к элементам ...
Но вернемся к проблеме.В C ++ вы должны использовать ссылки, а не указатели, чтобы позволить функции изменять аргумент, поэтому ваша оригинальная сигнатура размещения должна быть:
void AllocMat(int **&mat, int size);
И вызывать ее следующим образом:
int **matrix = 0;
AllocMat( matrix, 5 );
Илилучше просто вернуть указатель:
int **AllocMat( int size );
int **matrix = AllocMat( 5 );
Для функции освобождения, так как вам не нужно изменять внешний указатель, вы можете просто использовать:
void DeallocMat( int**mat, int size ); // size might be required to release the
// internal pointers
Теперь для эскиза решения C ++:
template <typename T> // no need to limit this to int
class square_matrix {
const unsigned size;
T * data;
public:
square_matrix( unsigned size ) : size(size), data( new T[size*size]() ) {}
square_matrix( matrix const & m ) : size( m.size ), data( new T[m.size*m.size] ) {
std::copy( m.data, m.data+size*size, data );
}
~matrix() {
delete [] data;
}
T const & operator()( unsigned x, unsigned y ) const {
// optional range check and throw exception
return data[ x + y*size ];
}
void set( unsigned x, unsigned y, T const & value ) {
// optional range check and throw exception
data[ x + y*size ] = value;
}
};