这是我的代码:
int dim_y, dim_x;
int **map_boundaries;
int **map;
int main( int argc, char* args[] ){
int i;
scanf("%d",&dim_x);
scanf("%d",&dim_y);
map_boundaries = (int **)calloc(dim_y + 40,sizeof(int*));
for(i = 0; i < dim_y + 40; i++){
map_boundaries[i] = (int *)calloc(dim_x + 40,sizeof(int));
}
(*map)[dim_x+40] = (int(*)[dim_x+40])&map_boundaries[20][20];
}
警告是针对最后一行的,最后一行应该如何?
当我有它这样的时候,它工作得很好:
#define dim_y 500
#define dim_x 600
int map_boundaries[dim_y+40][dim_x+40];
int (*map)[dim_x+40] = (int(*)[dim_x+40])&map_boundaries[20][20];
但我希望"dim_x"one_answers"dim_y"的值由用户提供,并且"map"是全局的。
首先,我们需要知道您想要实现什么。最后一行显然有问题,但在不知道您的意图的情况下,我们只能猜测如何修复它。让我们分析一下您的代码。
-
目前,您正在取消引用(未初始化)
(int**)
变量((int*)
),然后像数组一样使用它-这表明您打算将map
作为指向int
s数组的指针。 -
您正在动态分配大小为(
dim_x+40
)x(dim_y+40
)的二维map_boundaries
数组-请注意,有效索引将分别为0…dim_x
+40-1和0…dim_y
+40-1。
根据您的编辑,我了解到您希望使用map_boundaries
作为助手来动态分配全局map
。
事实上,您可以像以前一样分配表。要将map_boundaries
的整个数组分配给map
,您只需要像@BLUEPIXY建议的那样执行map = map_boundaries;
。然后您可以将map_boundaries
设为本地。
int dim_y, dim_x;
int **map;
int main( int argc, char* args[] ){
int **map_boundaries;
scanf("%d",&dim_x);
scanf("%d",&dim_y);
map_boundaries = (int**) calloc(dim_y+40, sizeof(int*));
for(int i = 0; i < dim_y+40; i++){
map_boundaries[i] = (int*) calloc(dim_x+40, sizeof(int));
}
map = map_boundaries;
}
出现警告是因为:
(*map)[dim_x+40]
是int
的类型(您可以通过取消引用未分配的内存来获得它,但编译器无法知道这一点)。(int(*)[dim_x+40])
(如果我没有弄错的话)的类型是array of pointers to int
((int*)[]
)-编译器将其隐式转换为int
,因为您将数据转换为无效类型。
如果这不是你想做的,请详细说明你实际上试图实现的目标,因为这并不明显。
编辑:
修剪map_boundaries
到map
(一种方法):
int trimmed_dim_y_start = 0;
int trimmed_dim_y_size = 20;
int trimmed_dim_x_start = 0;
int trimmed_dim_x_size = 20;
// ...
map = (int**) calloc(trimmed_dim_y_size, sizeof(int*));
for (int i = 0; i < trimmed_dim_y_size; i++) {
map[i] = map_boundaries[ trimmed_dim_y_start + i ] + trimmed_dim_x_start;
}
请注意,在这个变体中,您必须再次将map_boundaries
设置为全局,因为如果您不释放所有calloc,就会导致内存泄漏。也许在这个特殊的项目中没有那么糟糕,但这仍然是一个重要的实践来清理事情。
从int(*)中移除括号,并将所有int*放在括号中。
(*map)[dim_x+40] = ((int*)[dim_x+40])&map_boundaries[20][20];