gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:42 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com