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