抱歉,如果这是一个小白问题:(。

的C代码件。

int array[5];
int cnt;

for(cnt = 0; cnt <= 10; cnt+=1)
{
      array[cnt] = cnt;
}

应该给出一个错误,是吗?没有!工作正常! 但是,这是为什么?似乎-in第一LINE-比双尺寸更大的阵列(11)被定义。甚至可以访问数组[5至10]以后。这是混淆了我。它停止工作时定义阵列[4或更少] ...

预先感谢。

有帮助吗?

解决方案

有可能发生与特定的编译器和计算机的工作,但你不应该指望它。

根据C语言说明书中的代码的行为是未定义。这意味着它可能做你希望的东西,也可能导致您的计算机崩溃,或者它可能导致的恶魔飞出你的鼻子

不同于高级语言例如Java和C#,C信任你和阵列的界限不执行显式检查。你应该负责,而不是胎面阵列的边界之外。

其他提示

这唯一的“作品”,如果你的“作品”的定义是“还没有崩溃。”

代名词

你们看到的是的未定义的行为下,引起你访问该阵列具有无效索引。未定义行为意味着什么事情都可能发生,包括出现的正常工作程序。

“但是,这是为什么?”

由于是这样的方式C是

数组边界在运行时不进行检查。

这就是

“作为C法”

我只是想指出的是,这一切确实是不确定的。 你的榜样“作品”在这个具体的例子,因为这两个变量位于堆栈上。即CNT的地址是仅低于阵列的端部。当CNT达到CNT == 5 该语句阵列[CNT] = CNT;在专门为阵列的存储不写,但它之后,在CNT的地址所在。这只是运气,它不会改变你的柜台。 当CNT> 5没有内存垃圾和它只会在“堆栈空缺”(不知道正确的字)。写

另一个例子来说明这一点:

int main(int ac,char **av)
{
    int a[5];
    int cnt;
    int cnt2=3;

    for(cnt=0;cnt<7;cnt++) {
        a[cnt]=cnt;
        printf("%d %d %d\n", a[cnt], cnt, cnt2);
    }
}

输出:

0 0 3
1 1 3
2 2 3
3 3 3
4 4 3
5 5 5
6 6 5

循环的最后两个写入覆写之后的[]中的堆栈数据和可以产生非常混乱误差。在这种情况下,CNT2被丢弃。

在C数组没有在运行时检查。换言之,可以在“定义”的大小为N的阵列,并且愉快地访问关结合的阵列的端部的。如果去关闭阵列的端部,那么你将某处垃圾的堆(或堆)上存储器。

一旦垃圾内存的某个地方,你的程序很可能会崩溃。这些崩溃可能很难追查,因为他们可能会崩溃远离,你实际上占领了数组的结尾。

通常,当声明在C数组,它最好是使用某种恒定或#定义来标记数组的大小:

#define MAX_ELEMENTS 10
int array[MAX_ELEMENTS];
int cnt;
for(cnt = 0; cnt < MAX_ELEMENTS; cnt+=1) {
   array[cnt] = cnt;
}

如果您晃过MAX_ELEMENTS在数组赋值,则可能会覆盖CNT的值。您可能会覆盖其他一些变量。一切都取决于编译器和代码结构。另外要注意在使用<标志的for循环。 C数组是基于0,所以必须检查使用小于和不低于或相等到。

C中的数组边界是不一定检查在运行时。该标准留下实施者可以这样做,如果他们选择,或不 - 这是什么的未定义的一部分。在脂肪指针实现样品确实可能造成某种错误的。

一旦运行关闭阵列的端部,要覆盖存储器,该软件是不期望和损坏堆。您的软件可能会继续运行,但它会很不稳定!

取决于栈存储器是如何包装。此外,它会高兴地覆盖这些值,甚至阅读,但最有可能你正在摧毁栈。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top