为什么这个值赋值给指针数组不会给运行时错误有效?

时间:2017-01-03 09:40:57

标签: c arrays pointers

int *A [10];
A[2][3]=15;

此语句不会产生编译时错误,但是当我运行程序时,它会产生运行时错误。为什么?

编辑:我特别想知道为什么没有编译时错误?

3 个答案:

答案 0 :(得分:2)

  

此语句在c

中不提供编译时错误

因为编译器应该判断没有语法错误或约束违规。 C不对数组(或指针算术)进行任何绑定检查。

完全可以编写一个使用无效内存的代码(示例:取消引用无效的内存位置),但万一,编译器为这样的代码生成了二进制文件,运行二进制文件将调用undefined behaviour

  

但是当我运行程序时,它会产生运行时错误

在您的代码中,

  int *A [10];

A是一个包含10个int *的数组,并且未显式初始化。从代码片段看,A不在全局范围内,即没有static存储,因此每个指针的内容都是不确定

因此,稍后在编写A[2][3]=15;的过程中,您正在尝试访问 A[2](指针),指向无效记忆。这会调用未定义的行为。

答案 1 :(得分:1)

因为访问未初始化的指针A[2]会调用undefined behavior,这意味着就C标准而言,允许发生任何事情。

  

为什么没有编译时错误

因为在这种情况下标准不需要发出诊断(例如编译错误)。

答案 2 :(得分:0)

出于同样的原因

int a, d = 0;

a = 1 / d;

干净利落地编译。要检测无效操作,编译器需要运行程序。