c - 在 gcc 中出现错误但仍然成功运行

标签 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 中显示警告“从不兼容的指针类型 display(a,3,4) 传递 'display' 的参数 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],它与传递给来自调用者的函数。

关于c - 在 gcc 中出现错误但仍然成功运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39286501/

相关文章:

c - 通过定义向结构体添加元素

pointers - 当 p 是指针时,Go 中的 p 和 &p 有什么区别?

c - 为什么我不能做 strcpy?

c++ - 获取指向 LLVM-IR 中数组第一个元素的指针

java - 如何将二维数组的索引复制到另一个索引 java android

c - 在夹板的帮助下消除代码中的安全缺陷

c - PostgreSQL 模块 - 如何将参数数组映射到函数中?

c - linux .ko 中用于多个设备的全局变量

python - 将 numpy 值数组映射到图像的有效方法

python - 使用 lambda 遍历 numpy 数组