有没有办法硬编码二维整数数组而不必在 C 中提及任何维度?

Is there way to hard code a two dimensional integer array without having to mention any dimension in C?

我可以轻松地对 2D char 数组进行硬编码,避免指定最后一个维度,如下所示。

char *mobile_games[] = { "DISTRAINT", "BombSquad" }

虽然,我做不到...

char *pc_games[] = { { 'F', 'E', 'Z' }, { 'L', 'I', 'M', 'B', 'O' } }

当我尝试类似...

时会弹出相同的警告

int *rotation[] = { { 1, 0 }, { 0, 1 } }

我想知道发生这种情况的确切原因,以及如何通过不必提及最后一个维度来硬编码 int 数组。

这不是二维数组特有的。您也不能像这样初始化指针:

int *int_array = {1, 2};

它适用于字符串的原因是字符串文字在该上下文中使用时会衰减为指针。这就是为什么您可以在采用 char * 参数的函数的参数列表中使用字符串文字。

要执行您想要的操作,您需要将其声明为二维数组,而不是指针数组。

int rotation[][2] = { { 1, 0 }, {0, 1} };

如果你真的想要一个指针数组,你需要单独声明行值。

int rot0[] = {1, 0};
int rot1[] = {0, 1};
int *rotation[] = {rot0, rot1};

6.7.9的标准写的很清楚:

The initializer for a scalar...The initial value of the object is that of the expression (after conversion);...

并解释您的警告:

我得到了一个包含两个初始化列表的初始化列表:

main.c:4:26: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
  char *pc_games[] = { { 'F', 'E', 'Z' }, { 'L', 'I', 'M', 'B', 'O' } };
                         ^~~

其中第一个包含整数字符常量,你告诉我将其放入指针中,这不好...

main.c:4:31: warning: excess elements in scalar initializer
  char *pc_games[] = { { 'F', 'E', 'Z' }, { 'L', 'I', 'M', 'B', 'O' } };
                              ^~~

...但是我尝试了第一个,然后我发现了另一个我无能为力的整数字符常量,因为您指定的类型 (char *) 暗示了一个标量,是吗指的是指针数组?或者更好的是,一个整数数组?

main.c:4:45: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
  char *pc_games[] = { { 'F', 'E', 'Z' }, { 'L', 'I', 'M', 'B', 'O' } };
                                            ^~~

...然后我转到您指定的第二个初始化列表并尝试再次进行相同的转换...

main.c:4:50: warning: excess elements in scalar initializer
  char *pc_games[] = { { 'F', 'E', 'Z' }, { 'L', 'I', 'M', 'B', 'O' } };

...然后我在初始化列表中发现了更多杂散常量。这是怎么回事?您是说 char pc_games[2][5] 吗?


问:我把 char * 误认为是 char []。我可以char s[] = {'f', 'e', 'z'};吗? 答:是的。 6.7.9p14 还允许

An array of character type may be initialized by a character string literal or UTF-8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

所以char s[] = {"fez"};也是可以的