这是我的代码:
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];
但我想要&#34; dim_x&#34;的价值观。和&#34; dim_y&#34;由用户提供并且&#34; map&#34;是全球性的。
答案 0 :(得分:1)
首先,我们需要知道您想要达到的目标。最后一行显然有问题,但如果不知道你的意图,我们只会猜测如何修复它。我们来分析你的代码。
目前您正在取消引用(未初始化)(int**)
变量((int*)
),然后像数组一样使用它 - 这表明您希望map
成为{的数组的指针{1}}秒。
您动态分配大小为(int
)x(map_boundaries
)的二维dim_x+40
数组 - 请注意,有效索引将分别为0 ... { {1}} + 40-1和0 ... dim_y+40
+ 40-1。
从您的编辑中我了解到您希望使用dim_x
作为帮助来动态分配全局dim_y
。
确实你可以像你一样分配表格。要将map_boundaries
的整个数组分配给map
,您只需要{@ 1}}建议@BLUEPIXY。然后你可以map_boundaries
本地。
map
发生警告是因为:
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
为全局,因为如果您不释放所有calloc,则会导致内存泄漏。也许在这个特定的程序中并没有那么糟糕,但它仍然是清理事物的重要做法。
答案 1 :(得分:-2)
从int(*)中删除括号,并将所有int *放在括号中。
(*map)[dim_x+40] = ((int*)[dim_x+40])&map_boundaries[20][20];