即使使用 -Wall 选项,这在 gcc 中编译也没有错误或警告 这意味着在运行时检查数组边界,因此编译器无法检测到错误
#include<stdio.h>
int main()
{
int a[2][3][4];
a[1][2][100] = 4 ;
return 0;
}
但是,
#include<stdio.h>
int main()
{
int a[2][3];
a[1][2][100] = 4 ;
return 0;
}
这会在编译时产生错误:
$ gcc sample.c -Wall
sample.c: In function ‘main’:
sample.c:7: error: subscripted value is neither array nor pointer
为什么会这样?在这两个代码中,a[1][2][100] 都是无效的。编译器如何检测到这是 code2 而不是 code1。
特别是当每个编译器将所有多维数组扁平化为相应的单维数组时,编译器如何有选择地意识到代码中的这个缺陷。
对包含正确解释的某些书籍或文章的解释或提及将不胜感激:)
最佳答案
区别在于类型。 C 不进行边界检查,但会进行(静态)类型检查。第一个示例中 a 的类型是 int[][][]
但第二个示例中的类型是 int[][]
。
您提到的“扁平化”发生在代码生成中,这(至少在概念上)是在类型检查之后。
关于c - gcc 如何处理数组 [ 与 C 编程相关的问题 ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331870/