【问题标题】:Why assigning an array to a matrix is illegal? [duplicate]为什么将数组分配给矩阵是非法的? [复制]
【发布时间】:2019-03-14 08:54:01
【问题描述】:

我有一个关于 C 语法的问题,这怎么可能:

int a[ ][2] = { 1, 2, 3, 4 };

合法为什么不合法:

int a[] = { 1, 2, 3, 4 };
int b[ ][2] = a;

甚至:

int a[] = { 1, 2, 3, 4 };
int *b[2] = a;

不合法。

从指针数学的角度来看,它自己无法处理这件事有什么难的?这只是语法的问题还是编译器无法推断出正确的内存步长?

gcc 错误:

main.c:14:19: error: invalid initializer
     int b[ ][2] = a;

【问题讨论】:

  • CC++? (它们是不同的语言,有不同的限制!)
  • 赋值和初始化是完全不同的操作。
  • 现在只是 C.
  • 恕我直言int a[ ][2] = { 1, 2, 3, 4 }; 的合法性是转移注意力,完全无关紧要。这只是初始化数组的语法。问题是为什么不能将数组分配给矩阵/数组。仅仅因为它看起来相似或者看起来你可以删除 a 作为一些临时的东西并不意味着代码是等效的。
  • @DavidBowling 链接的欺骗提供了一些关于 C 历史的见解。不幸的是,与贝尔实验室的一些死链接,可能是丹尼斯里奇的原始理由等。

标签: c arrays matrix


【解决方案1】:

解释很简单。

两个主要原因:

  1. 在 C 中你不能分配数组。 在 C 中允许赋值的唯一复杂类型是结构和联合。
  2. 全局变量的初始化需要常量表达式。

【讨论】:

  • @DavidBowling 这个问题没有答案。就像为什么在英语中我们说“我是”而不是“我是”
  • 这与全局变量无关。同样的限制也适用于当地人。
  • 是的,我知道没有答案,这就是为什么我投票以“主要基于意见”的方式结束。
  • 第二个注释的意义何在,显然 OP 不要求全局变量大小写。
  • @TimRandall 不,你在拧。自动(如果局部变量意味着自动)变量不需要 const 表达式作为初始化器
猜你喜欢
  • 2017-03-28
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2023-03-03
  • 2020-10-20
  • 2017-03-12
  • 2011-08-12
相关资源
最近更新 更多