定义一个简单的整数数组

问题描述

| 我为什么可以这样做?
int array[4]; // i assume this creates an array with 4 indexes

array[25]=1; // i have assigned an index larger than the int declaration

NSLog(@\"result: %i\",array[25]); // this prints \"1\" to the screen
如果索引超出了声明,为什么这样做有效?如果数字对数组的实际作用没有影响,那么它在声明中的意义是什么? 谢谢。     

解决方法

您正在获得未定义的行为。它可以打印任何东西,它可能崩溃,它可能突然唱歌(好吧,虽然不太可能,但是您明白了)。 如果碰巧写入具有足够权限映射的位置,则它将起作用。直到有一天不会因为其他布局而异。     ,它是未定义的。有些操作系统会给您分段错误,而有些则可以容忍。无论如何,应避免超过阵列的大小。     ,数组实际上只是一个指向连续分配的内存块开始的指针。 在这种情况下,您分配了4个int的内存。 因此,如果您使用array [2],它会认为\“ array的内存+ sizeof(int)* 2 \” 将2更改为25,那么您一开始就只需要查看25 int的内存即可。由于没有检查(在分配或打印时)是否在范围之内,因此它可以工作。 没什么可说的,虽然可能还有其他分配!     ,清除中的数字确定应保留多少个内存,在这种情况下为“ 1”。 如果超出范围写入内存,则可以这样做,但不建议这样做。在C语言中,您可以访问程序可用的内存中的任何点,但是如果未为该内容保留写入内容,则可能会导致内存损坏。数组是指针(但并非相反)。 行为取决于编译器,平台和某些随机性。不要做。     ,它正在做非常糟糕的事情。如果数组是在函数的本地声明的,则可能是在当前函数的堆栈框架上方的堆栈位置上编写。如果是全局声明的,则可能是在分配给相邻变量的内存上写的。无论哪种方式,它都是靠运气“工作”的。     ,您的C编译器可能出于内存对齐的目的填充了数组,但很幸运,数组溢出恰好仍在向上舍入的分配之内。不过不要依赖它。     ,这是不安全的编程。确实应该避免使用它,因为它可能不会使您的程序崩溃。这确实是您所希望的最好的东西。它可能会给您带来垃圾结果。这些是不可预测的,并且可能会使您的程序更加混乱。但是,由于您不知道这是错误的,因为它不会崩溃,它将破坏数据的完整性。由于没有使用C的try / catch,因此您确实应该检查输入。记住scanf返回一个整数。     ,C语言设计不执行数组边界检查。它被设计为系统级语言,并且在许多情况下,显式运行时边界检查的开销可能会过高。因此,C将允许使用“危险”代码,因此必须谨慎使用。如果您需要“更安全”的东西,那么C#或Java可能更合适,但是肯定会降低性能。 自动化的静态分析工具可能会有所帮助,并且有运行时边界检查工具可用于开发和调试。 在C语言中,数组是连续的内存块。通过越界访问阵列,您只需访问超出阵列末尾的内存即可。访问此类内存的操作是不确定的,它可能是垃圾,可能属于相邻变量,或者可能属于调用函数或更高版本的变量。它可能是当前函数或调用函数的返回地址。在受内存保护的操作系统(例如Windows或Linux)中,如果访问范围超出了范围,以致不再位于分配给该进程的地址范围内,则会发生错误异常。