【问题标题】:Warning: assignment from incompatible pointer type for a 2D array pointer警告:从不兼容的指针类型分配二维数组指针
【发布时间】:2014-10-10 08:54:12
【问题描述】:

对于我的问题的简单性及其与已经提出的问题的相似性,我深表歉意。我已经研究了类似的问题并研究了几个小时,但我无法纠正我所拥有的任何阻碍我理解它的误解。

在下面的代码摘录中,警告“assignment from incompatible pointer type [enabled by default]'出现在注释为'Warning'的行的等号处。

char * readFile(int width, int height)
{
    char mapArray[width][height];
    char *p;
    p = mapArray;     // Warning
    return p;
}

这是为什么呢?

我目前的理解是“mapArray”包含二维字符数组的第一个元素的地址。 'p' 的定义是,它将来会包含内存中存在 char 的另一个位置的地址。然后将“p”的值设置为“mapArray”的当前值,因此它现在包含所述数组的第一个元素的地址。该函数返回 p 的值,它是一个地址,即一个指针,指向内存中的一个 char。

如果有人能告诉我我的理解在哪里下降,以及不兼容的指针类型在哪里进入,我将不胜感激。

【问题讨论】:

  • p = mapArray; --> p = *mapArray; 但不能在函数中返回本地地址。
  • @BLUEPIXY 这也使警告消失了。也非常感谢!这种修改是否意味着“p”现在包含第一个元素的地址?为什么地址 in mapArray 是本地的,而地址 of mapArray 不是?
  • 是的 p 现在指向&mapArray[0][0]为什么mapArray中的地址是本地的mapArray指向区域会在函数作用域结束时释放。

标签: c arrays pointers warnings


【解决方案1】:

mapArray 的返回类型为 char ()[height],而您声明的指针 p 的类型为 char。所以 p 只能将指针指向一个一维数组。如果您按如下方式编写,则不会收到警告,因为 mapArray[0] 返回指向高度字符的一维数组的指针:

p = mapArray [0];

【讨论】:

    【解决方案2】:

    你不能使用char mapArray[width][height]

    表达式必须具有常量值。

    char (*p)[height] 也是如此

    当您不知道数组的大小时,您应该为数组分配内存。

    类似这样的:

    char * readFile(int width, int height)
    {
        char **mapArray;
        mapArray = (char **)malloc(sizeof(char *)* width);
        for (int i = 0; i < height; i++)
            mapArray[i] = (char *)malloc(sizeof(char)* width);
        char *p;
        p = *mapArray;
        return p;
    }
    

    【讨论】:

    • 你有c++ 吗?无论如何,这不会导致mapArray[0] 之外的任何内容发生内存泄漏吗?
    • 请注意 you should not cast the result of malloc in C 并注意 sizeof(char) 是多余的,因为根据定义,它始终等于 1。
    • 另请注意,C 从 C99 开始就支持 VLA,因此上述解决方案有些过时了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多