传递二维数组作为函数参数时的编译器警告

问题描述 投票:0回答:1

我编写了以下简单程序来打印给定矩阵:

#include <stdio.h>
#include <stdlib.h>

char matrix[10][10] = {
        {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
        {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
        {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
        {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
        {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
        {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
        {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
        {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
        {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
        {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}
};

void printMatrix(char* matrix, int matrix_size)
{
  for (int i = 0; i < matrix_size; i = i + 1)
    {
      for (int j = 0; j < matrix_size; j = j + 1)
        {
          printf("%c", matrix[i * matrix_size + j]);
          if (j == matrix_size - 1)
            printf("\n");
        }
    }
  printf("\n");
}

int main()
{
     printMatrix(matrix, 10);
}

程序按预期运行,但我的编译器(GNU)给出以下警告:

...warning: passing argument 1 of 'printMatrix' from incompatible pointer type [-Wincompatible-pointer-types]|
...note: expected 'char *' but argument is of type 'char (*)[10]'|
||=== Build finished: 0 error(s), 1 warning(s) (0 minute(s), 3 second(s)) ===|

你能告诉我我做错了什么吗?

arrays c compiler-warnings
1个回答
1
投票

数组在表达式中使用或声明为函数参数时,“衰减”为指向第一个元素的指针。

char [10][10]
的第一个元素是
char [10]
类型。指向此类数组元素的指针是
char (*)[10]
。因此:

预期 '

char *
' 但参数类型为 '
char (*)[10]
'

这些是不兼容的指针类型,因此您的代码无效 C。您的编译器无论如何都会生成一个可执行文件,因为您使用宽松的非标准设置运行它 - 我建议切换到这个:What compiler options are recommended for beginners learning C? 因为什么如果您运行由无效 C 组成的可执行文件,将会发生这种情况,这是任何人的猜测。

但是,C 中有一条规则说任何类型都可以使用字符指针逐字节检查。因此,如果您只是将代码更改为

printMatrix((char*)matrix, 10);
那么它是有效的 C 并且实际上保证可以按预期工作。

重写整个函数以正确使用二维数组是更好的做法:

void printMatrix (int matrix_size, char matrix[matrix_size][matrix_size])
© www.soinside.com 2019 - 2024. All rights reserved.