int *A [10];
A[2][3]=15;
此语句不会产生编译时错误,但是当我运行程序时,它会产生运行时错误。为什么?
编辑:我特别想知道为什么没有编译时错误?
答案 0 :(得分:2)
此语句在c
中不提供编译时错误
因为编译器应该判断没有语法错误或约束违规。 C不对数组(或指针算术)进行任何绑定检查。
完全可以编写一个使用无效内存的代码(示例:取消引用无效的内存位置),但万一,编译器为这样的代码生成了二进制文件,运行二进制文件将调用undefined behaviour。
但是当我运行程序时,它会产生运行时错误
在您的代码中,
int *A [10];
A
是一个包含10个int *
的数组,并且未显式初始化。从代码片段看,A
不在全局范围内,即没有static
存储,因此每个指针的内容都是不确定。
因此,稍后在编写A[2][3]=15;
的过程中,您正在尝试访问 A[2]
(指针),指向无效记忆。这会调用未定义的行为。
答案 1 :(得分:1)
答案 2 :(得分:0)
出于同样的原因
int a, d = 0;
a = 1 / d;
干净利落地编译。要检测无效操作,编译器需要运行程序。