警告:赋值使指针中的整数不带C中的强制转换



这是我的代码:

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"是全局的。

首先,我们需要知道您想要实现什么。最后一行显然有问题,但在不知道您的意图的情况下,我们只能猜测如何修复它。让我们分析一下您的代码。

  1. 目前,您正在取消引用(未初始化)(int**)变量((int*)),然后像数组一样使用它-这表明您打算将map作为指向int s数组的指针。

  2. 您正在动态分配大小为(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;
}

出现警告是因为:

  1. (*map)[dim_x+40]int的类型(您可以通过取消引用未分配的内存来获得它,但编译器无法知道这一点)。

  2. (int(*)[dim_x+40])(如果我没有弄错的话)的类型是array of pointers to int(int*)[])-编译器将其隐式转换为int,因为您将数据转换为无效类型。

如果这不是你想做的,请详细说明你实际上试图实现的目标,因为这并不明显。

编辑:

修剪map_boundariesmap(一种方法):

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];

最新更新