【问题标题】:getting error in gcc but runs successfully anyway在 gcc 中出现错误,但仍然成功运行
【发布时间】:2016-09-02 07:19:56
【问题描述】:
#include<stdio.h>
void display(int *q,int,int);
int main(){
int a[3][4]={
             2,3,4,5,
             5,7,6,8,
             9,0,1,6
            };
display(a,3,4);
return 0;
}
void display(int *q,int row,int col){
  int i,j;
      for(i=0;i<row;i++){
           for(j=0;j<col;j++){
                 printf("%d",*(q+i*col+j));
                 }
 printf("\n");
}
printf("\n");
}

为什么这段代码在 gcc 中显示警告“从不兼容的指针类型 display(a,3,4) 传递 'display' 的参数 1”?...无论如何都可以成功运行,但很想知道错误..如果有人可以告诉这个我会很感激..

【问题讨论】:

  • display(a,3,4) 应该是 display(&amp;a[0][0],3,4)display((int *)a,3,4)
  • 实际上我认为没有必要这样做,因为我将它传递给 *q...所以它应该完成...我认为....它仍然运行但显示警告内容

标签: c arrays pointers gcc


【解决方案1】:

“数组衰减”规则意味着每当您使用数组名称a 作为表达式的一部分时,它都会“衰减”为指向第一个元素的指针。

对于一维数组,这非常简单。数组int a [10] 会衰减为类型int*

但是,在二维数组的情况下,二维数组的第一个元素是一维数组。在您的情况下,int a[3][4] 的第一个元素具有数组类型 int [4]

数组衰减规则为您提供了一个指向此类数组的指针,数组指针,类型为int (*)[4]。此类型与您的函数期望的类型 int* 不兼容。

但是,幸运的是,数组指针和普通 int 指针在您的系统上似乎具有相同的表示形式,并且它们恰好拥有相同的地址,因此代码可以正常工作。但是,您不应该依赖它,它不是明确定义的行为,也不能保证它会起作用。


您应该通过以下方式修复您的程序:

#include <stdio.h>

void display (int row, int col, int arr[row][col]);

int main()
{
  int a[3][4]=
  {
    {2,3,4,5},
    {5,7,6,8},
    {9,0,1,6},
  };

  display(3, 4, a);
  return 0;
}

void display (int row, int col, int arr[row][col])
{
  for(int i=0; i<row; i++)
  {
    for(int j=0; j<col; j++)
    {
      printf("%d ", arr[i][j]);
    }
    printf("\n");
  }
  printf("\n");
}

这里,作为函数参数的数组类型将被编译器静默“调整”到指向第一个元素 int(*)[4] 的指针,它与调用者传递给函数的内容相匹配。

【讨论】:

  • 我实际上是这样做的,而且进展顺利,没有警告..没有错误.....我使用了另一种方法,也是“指向数组事物的指针”......我只是很想知道那个特别的警告......而且我没有得到任何东西在我的例子中,int a[3][4] 的第一个元素具有数组类型 int [4]..??.. :(
【解决方案2】:

因为它们是不兼容的指针类型,所以恰好int * 可以指向ints 的数组,而int[][] 是排列在连续内存中的int 的数组。

重要的区别在于,虽然您可以使用两个索引表示法访问 a,例如 a[i][j],但您不能使用 q 进行访问。

【讨论】:

  • 但是当他传递数组维度时,我认为只要他不尝试将其作为二维数组访问,这应该可以工作。应该可以像这样 q[i*row+j] 访问它。 (i
  • @KamiKaze 是的,因为数组存储在内存中。
猜你喜欢
  • 2020-05-28
  • 1970-01-01
  • 2013-05-22
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2018-06-26
  • 2015-01-06
相关资源
最近更新 更多