2017-01-03 107 views
2
int *A [10]; 
A[2][3]=15; 

该语句没有编译时错误,但是当我运行该程序时,它给出了运行时错误。为什么?为什么赋值给指针数组不会给运行时错误有效?

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

+2

为什么这应该是一个运行时错误?在哪里进行那种会产生错误的检查的逻辑? –

回答

2

这种结给人在C

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

您将被完全允许编写使用无效内存的代码(示例:取消引用无效内存位置),但如果编译器为此类代码生成二进制文件,则运行该二进制文件将调用undefined behaviour

然而,当我运行程序,它提供了一个运行时错误

在你的代码,

int *A [10]; 

A是10 int *秒的阵列,它们都没有显式初始化。从片段看,看起来A不在全局范围内,即没有static存储,所以这些指针中的每一个的内容都是不确定的

所以,后来在写作A[2][3]=15;的过程中,你要访问A[2](指针),它指向一个无效内存。这会调用未定义的行为。

+0

'A [2]'是数组'A'中的一个有效元素......您上一句话中的措词可能会更好 – StoryTeller

+0

@StoryTeller正确,但它不会指向任何有效的东西。请建议或随意编辑,无后顾之忧。 :) –

+1

@StoryTeller谢谢,我也加了一点。 :) –

1

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

为什么没有编译时错误

由于标准不要求诊断(如编译错误)在这种情况下发出的。

+0

我认为更好的措辞将是*“未初始化的指针**在** A [2]”*。但这只是我。 – StoryTeller

0

这是出于同样的原因是

​​

编译干净。为了检测无效操作,编译器需要运行该程序。

相关问题