我需要在标题中声明一个动态分配的二维数组,而不知道它的维度,这将在函数内部建立。
在我要放置的标题中:
#define MAX_BARS_ALLOWED 20000
extern int Gregorian[][MAX_LINES_ALLOWED]; //it works
并在.cpp
文件中,在函数内部:
int **Gregorian=new int*[NumLastItem+1][MAX_LINES_ALLOWED]; //this does NOT work, why ?
...因为我在一个函数中初始化它,它是否真的是全局的。
任何人都可以教我正确这样做吗?提前谢谢!!
答案 0 :(得分:0)
这是我最喜欢在堆上声明一个可变大小的矩阵的方法:你在每一行的末尾分配一个额外的elem,以便知道边界的位置(它有点像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 );
此片段是从那里复制的:int matrix with pointers in C - memory allocation confusion
用法:
标题中的:
#define MAX_BARS_ALLOWED 2000
extern int** Gregorian;
在cpp:
Gregorian = read_matrix(NumLastItem+1,MAX_LINES_ALLOWED);
答案 1 :(得分:0)
如果在函数内创建具有相同名称的数组的新实例,则覆盖并隐藏上一个实例。您可以分配外部数组,但不要创建具有相同名称的新变量。
答案 2 :(得分:-1)
在头文件中有一个特殊的实现源定义。像这样:
#ifndef ARRAY_HEADER_HPP
#define ARRAY_HEADER_HPP 1
#ifdef ARRAY_IMPL
#define extern // remove extern for implementation
#endif
#define MAX_LINES_ALLOWED 20000
extern int **Georgian;
#ifdef ARRAY_IMPL
#undef extern
#endif
#endif // ARRAY_HEADER_HPP
然后在分配数组的位置包含像这样的标题
#define ARRAY_IMPL
#include "array_header.hpp"
void alloc_array(){
Georgian = new int*[var+1];
for(size_t n = 0; n < (var+1); n++)
Georgian[n] = new int[MAX_LINES_ALLOWED];
}
void dealloc_array(){
for(size_t n = 0; n < (var+1); n++)
delete[] Georgian[n];
delete[] Georgian;
}