【问题标题】:warning: assignment to int ** from incompatible pointer type const int (*)[3]警告:从不兼容的指针类型 const int (*)[3] 分配给 int **
【发布时间】:2021-07-17 09:53:22
【问题描述】:

将矩阵的指针赋值给双指针时出现问题,接下来会用到,如下:

const int COLOR_MAP_INDIA[16][3] = {{ 140, 67, 46 },{ 0, 0, 255 },{ 255, 100, 0 },{ 0, 255, 123 },{ 164, 75, 155 },{ 101, 174, 255 },{ 118, 254, 172 },{ 60, 91, 112 },{ 255, 255, 0 },{ 255, 255, 125 },{ 255, 0, 255 },{ 100, 0, 255 },{ 0, 172, 254 },{ 0, 255, 0 },{ 171, 175, 80 },{ 101, 193, 60 }};

int main(int argc, char *argv[]){
    int **COLOR_MAP;

    COLOR_MAP= COLOR_MAP_INDIA;
}

编译器说:

警告:从不兼容的指针类型 const int 分配给 int ** (*)[3]

怎么了?

【问题讨论】:

  • TLDR:像int **COLOR_MAP never 这样的东西指的是实际的二维数组。当被错误地称为“二维数组”或类似名称时,它通常是指指向多个单独、独立和独立的一维值数组的指针的一维数组。

标签: c pointers


【解决方案1】:

即使您仅通过COLOR_MAP 阅读也会出现分段错误。

它被定义为包含指针(指向值),而不是三行中的值。

如果 COLOR_MAP 的值为 140, 67,,它需要第一行的地址。

可以使用警告指示的抽象类型:

int (*COLOR_MAP)[3];
COLOR_MAP= COLOR_MAP_INDIA;
printf("%d\n", COLOR_MAP[2][1]);

const 不匹配是相同的,只是不那么引人注目。


指针数组版本

可以使用额外的指针层为这些 RGB 三元组(也称为颜色)命名:

int orange[] = {140,67,46};
int blue[] = {0,0,255};
int greenblue[] = {0,255,123};
int purple[] = {200,0, 200};

int *INDIA[] = {orange, greenblue, blue, purple};
int *INDIA_2[] = {greenblue, orange, purple, blue};

int main(int argc, char *argv[]){

    int **MAP;

    MAP = INDIA;
    printf("%d\n", MAP[1][2]);   // 123 
    MAP = INDIA_2;
    printf("%d\n", MAP[1][2]);   // 46
}

完全不同的方法,但元素的访问方式与二维数组 MAP[1][2] 相同。

【讨论】:

    【解决方案2】:

    警告:从不兼容的指针类型 const int (*)[3]

    赋值给 int **

    您的编译器几乎可以告诉您所有错误。您需要知道的是指向指针的指针(在您的情况下是 COLOR_MAP)不等于指向 3 个整数的一维数组的指针(在这种情况下为 COLOR_MAP_INDIA)。 本质上,您可能想考虑当它们都是指针时有什么区别。 但是当您尝试使用指针算法访问该指针周围的元素时,差异就出现了。

    当你写作时:

    COLOR_MAP_INDIA

    你的意思是它是一个指向包含3个整数的一维数组的指针({140,67,46}的内存地址,实际上是140的地址)。所以,当你做类似的事情时,

    COLOR_MAP_INDIA + 1

    您现在将指向下一个由 3 个整数组成的一维数组({ 0, 0, 255 } 的内存地址,在这种情况下是第一个 0)并且 NOT 中的第二个元素第一个数组。

    指针是强类型的,因为您可以对它们执行指针运算,并且每个此类运算并不一定意味着加/减 1。

    【讨论】:

      【解决方案3】:

      COLOR_MAP 被定义为指向int 的指针的指针,而COLOR_MAP_INDIA 是由3 个int 组成的16 个数组的数组。这些类型不兼容。您应该将 COLOR_MAP 定义为指向 3 个 int 的数组的指针:

      int (*COLOR_MAP)[3] = COLOR_MAP_INDIA;
      

      这个指针是否适合你的需要取决于你打算在代码的未发布部分做什么。

      【讨论】:

      • 实际上我在文件开头定义了不同的颜色映射,这些映射将根据字符串使用,因此使用 if-elseif 子句我会将相应映射的指针分配给更通用的指针将用于访问数据。我尝试了您的解决方案,但收到另一个警告...warning: assignment to int from const int (*)[3] makes integer from pointer without a cast (*COLOR_MAP)[16] = COLOR_MAP_DC;
      • 您需要int (*COLOR_MAP)[3] 而不是int (*COLOR_MAP)[16](内部尺寸被保留,外部尺寸衰减)。
      • 应该是int (*COLOR_MAP)[3] = COLOR_MAP_INDIA;
      • @n.1.8e9-where's-my-sharem。是的,我的错,这种语法太痛苦了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多