这是我最喜欢在堆上声明可变大小矩阵的方法:在每一行的末尾分配一个额外的元素,以便知道边界在哪里(有点像 C 风格的字符串)。
int** read_matrix(int size_x, int size_y)
{
int** matrix;
matrix = calloc(size_x, 1+sizeof(int*)); // alloc one extra ptr
for(int i = 0;i<size_x;i++) {
matrix[i] = calloc(size_y, sizeof(int));
}
matrix[size_x] = NULL; // set the extra ptr to NULL
/* populate the matrix if needed
for(int i = 0;i<size_x;i++) {
for(int j = 0;j<size_y;j++) {
matrix[i][j] = i*10+j;
}
}
*/
return matrix;
}
// keep looping until you find the NULL one
for( int i=0; first_matrix[i] != NULL; i++ ) {
free( first_matrix[i] );
}
free( first_matrix );
这个片段是从那里复制的:带有 C 指针的 int 矩阵 - 内存分配混乱
用法:
在标题中:
#define MAX_BARS_ALLOWED 2000
extern int** Gregorian;
在 cpp 中:
Gregorian = read_matrix(NumLastItem+1,MAX_LINES_ALLOWED);