c - gcc 如何处理数组 [ 与 C 编程相关的问题 ]

标签 c arrays pointers gcc compiler-construction

即使使用 -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/

相关文章:

c - 给定函数 `decode` ,我如何进行逆运算并将函数写入 `encode` ?

c - 堆栈分配、填充和对齐

c - 是否存在这种特定排序算法不起作用的情况?

c - 从堆栈和堆中获取二维数组的函数

Swift:创建指针数组以调用 C 函数

c - 为什么将 NULL 转换为结构指针?

c++ - 如何在 C++ 中使用指针翻转 Char 数组

c - 这个扫描文件并返回行数/段落数/字数的程序有什么问题?

Python 在没有 shell=false 和数组中的变量的情况下使用子进程时出错

java - 包含 if 语句的 for 循环不再循环