在gcc中获取错误但无论如何都成功运行

时间:2016-09-02 07:19:56

标签: c arrays pointers gcc

#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中显示警告&#34;传递参数1&#39;显示&#39;来自不兼容的指针类型显示(a,3,4)&#34;?...无论如何都成功运行但很想知道错误..如果有人能说出来我会很感激..

2 个答案:

答案 0 :(得分:1)

因为它们是不兼容的指针类型,只是int *可能指向int s的数组,而int[][]int数组,排列在重点内存中

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

答案 1 :(得分:1)

&#34;阵列衰变的规则&#34;意味着每当您使用数组名称int a [10]作为表达式的一部分时,它就会衰减&#34;指向第一个元素的指针。

对于1D阵列,这非常简单。数组int*会衰减为int a[3][4]类型。

然而,在二维阵列的情况下,2D阵列的第一个元素是一维阵列。在您的情况下,int [4]的第一个元素具有数组类型int (*)[4]

数组衰减规则为您提供了一个指向此类数组的指针,一个类型为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指针在您的系统上具有相同的表示,并且它们碰巧保持相同的地址,因此代码可以工作。你不应该依赖于此,它不是明确定义的行为,并且不能保证它会起作用。

您应该按以下方式修复您的计划:

int(*)[4]

这里作为函数参数的数组类型将默默地进行调整&#34;由编译器指向第一个元素{{1}}的指针,该元素匹配从调用者传递给函数的内容。