c - 为什么在初始化多维数组时不能完全省略维度?

标签 c multidimensional-array initialization

在 Visual Studio 2010 中,此初始化按预期工作:

char table[2][2] = {
                       {'a', 'b'},
                       {'c', 'd'}
                   };

但是这样写似乎是不合法的:

char table[][] = {
                     {'a', 'b'},
                     {'c', 'd'}
                 };

Visual Studio 提示这个数组可能不包含“那个”类型的元素,编译后,VS 报告两个错误:缺少索引和太多初始化。

问题:为什么我不能在初始化多维数组时完全省略维度?

最佳答案

只能省略最里面的维度。数组中元素的大小是根据给定数组变量的类型推导出来的。因此,元素类型必须具有已知大小。

  • char a[]; 具有 大小 1(8 位)的元素(例如 a[0]),并且大小未知.
  • char a[6]; 具有大小 1 和 6 的元素。
  • char a[][6]; 有元素(例如 a[0],它是一个数组)大小 6,大小未知。
  • char a[10][6]; 具有大小 6 的元素,并且大小为 60。

不允许:

  • char a[10][]; 将包含 10 个未知大小的元素。
  • char a[][]; 会有未知数量的元素未知大小

元素的大小是强制性的,编译器需要它来访问元素(通过指针运算)。

关于c - 为什么在初始化多维数组时不能完全省略维度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7432831/

相关文章:

c - 从 pthread_create 将多个参数传递给线程函数

java - Java中如何构造二维数组?

c++ - 将指针传递给二维数组 C++

java - 非最终字段的安全初始化

c - select() 和 C 上带有动态缓冲区的非阻塞 recv

c++ - 宏 ((void(*)())0)() 是什么意思?

c - 在 pthread 库中禁用 c 断言

c - 0xC000005 读取时访问冲突,在 C 中使用 strcmp

Java:初始化问题,无法从 arrayList 打印 "assigned"值

c - C中thread_local对象初始化为0吗?