警告:赋值在没有C语言转换的情况下从指针生成整数

时间:2014-10-14 11:56:08

标签: c pointers casting

这是我的代码:

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;是全球性的。

2 个答案:

答案 0 :(得分:1)

首先,我们需要知道您想要达到的目标。最后一行显然有问题,但如果不知道你的意图,我们只会猜测如何修复它。我们来分析你的代码。

  1. 目前您正在取消引用(未初始化)(int**)变量((int*)),然后像数组一样使用它 - 这表明您希望map成为{的数组的指针{1}}秒。

  2. 您动态分配大小为(int)x(map_boundaries)的二维dim_x+40数组 - 请注意,有效索引将分别为0 ... { {1}} + 40-1和0 ... dim_y+40 + 40-1。

  3. 从您的编辑中我了解到您希望使用dim_x作为帮助来动态分配全局dim_y

    确实你可以像你一样分配表格。要将map_boundaries的整个数组分配给map,您只需要{@ 1}}建议@BLUEPIXY。然后你可以map_boundaries本地。

    map

    发生警告是因为:

    1. map = map_boundaries;map_boundaries的类型(您可以通过解除引用未分配的内存来获取它,但编译器无法知道)。

    2. 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]),因为你开始投射数据进入无效类型。

    3. 如果那不是你想要做的,请详细说明你实际想要达到的目标,因为它并不明显。

      编辑:

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