int *A [10];
A[2][3]=15;
该语句没有编译时错误,但是当我运行该程序时,它给出了运行时错误。为什么?为什么赋值给指针数组不会给运行时错误有效?
编辑:我特别想知道为什么没有编译时错误?
int *A [10];
A[2][3]=15;
该语句没有编译时错误,但是当我运行该程序时,它给出了运行时错误。为什么?为什么赋值给指针数组不会给运行时错误有效?
编辑:我特别想知道为什么没有编译时错误?
这种结给人在C
没有编译时错误,因为没有语法错误或约束违反该编译器应该判断。 C不会对数组(或指针算术)进行任何绑定检查。
您将被完全允许编写使用无效内存的代码(示例:取消引用无效内存位置),但如果编译器为此类代码生成二进制文件,则运行该二进制文件将调用undefined behaviour。
然而,当我运行程序,它提供了一个运行时错误
在你的代码,
int *A [10];
A
是10 int *
秒的阵列,它们都没有显式初始化。从片段看,看起来A
不在全局范围内,即没有static
存储,所以这些指针中的每一个的内容都是不确定的。
所以,后来在写作A[2][3]=15;
的过程中,你要访问A[2]
(指针),它指向一个无效内存。这会调用未定义的行为。
'A [2]'是数组'A'中的一个有效元素......您上一句话中的措词可能会更好 – StoryTeller
@StoryTeller正确,但它不会指向任何有效的东西。请建议或随意编辑,无后顾之忧。 :) –
@StoryTeller谢谢,我也加了一点。 :) –
我认为更好的措辞将是*“未初始化的指针**在** A [2]”*。但这只是我。 – StoryTeller
这是出于同样的原因是
编译干净。为了检测无效操作,编译器需要运行该程序。
为什么这应该是一个运行时错误?在哪里进行那种会产生错误的检查的逻辑? –