定义一个简单的整数数组

时间:2011-05-24 20:29:01

标签: c arrays

为什么我能这样做?

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

如果索引超出声明,为什么会这样?如果它对你可以用数组实际做什么没有影响,那么声明中数字的意义是什么?

感谢。

8 个答案:

答案 0 :(得分:4)

您正在获得未定义的行为。它可以打印任何东西,它可能会崩溃,它可能会爆发唱歌(好吧,这不太可能,但你明白了)。

如果碰巧写入使用足够权限映射的位置,它将起作用。直到有一天它不会因为不同的布局。

答案 1 :(得分:1)

未定义。某些操作系统会给你分段错误,而有些则容忍这一点。无论如何,应该避免超出阵列的大小。

答案 2 :(得分:1)

数组实际上只是指向连续分配的内存块的开始的指针。

在这种情况下,您已经分配了4个内存值。

所以如果你去了数组[2]它会认为“数组中的内存+ sizeof(int)* 2”

将2更改为25,并且您只是在开始时查看25 int的内存值。由于没有检查来验证你是否在界限内(无论是在分配还是打印时)它都有效。

没有什么可说的,但其他人可能会在那里分配!

答案 3 :(得分:0)

decleration中的数字决定了应该保留多少内存,在这种情况下4 * sizeof(int)

如果您写入超出界限的内存,这是可能的,但不推荐。在C中,您可以访问程序可用的任何内存点,但如果您写入该内容,如果没有为该内容保留,则可能导致内存损坏。数组是指针(但不是相反)。

行为取决于编译器,平台和一些随机性。 不要这样做。

答案 4 :(得分:0)

这是非常糟糕的事情。如果数组在本地声明为函数,那么您可能正在写入当前函数堆栈帧上方的堆栈位置。如果它是全局声明的,那么你可能正在写入分配给相邻变量的内存。无论哪种方式,它都是纯粹的运气“工作”。

答案 5 :(得分:0)

你的C编译器可能为了内存对齐目的填充了你的数组,幸运的是你的数组溢出恰好仍然在舍入分配中。不过不要依赖它。

答案 6 :(得分:0)

这是不安全的编程。它应该被避免,因为它可能不会导致程序崩溃。这是你真正希望的最好的事情。它可以给你垃圾结果。这些都是不可预测的,可能会搞砸你的程序。但是,由于您不知道这是错误的,因为它不会崩溃会破坏数据的完整性。由于没有使用C的try / catch,你真的应该检查输入。记住scanf返回一个int。

答案 7 :(得分:0)

C by design不执行数组边界检查。它被设计为系统级语言,并且在很多情况下,显式运行时边界检查的开销可能过高。因此,C将允许“危险”代码,必须谨慎使用。如果你需要更“安全”的东西,那么C#或Java可能更合适,但是会有明显的性能影响。

自动静态分析工具可能会有所帮助,并且有一些运行时边界检查工具可用于开发和调试。

在C中,数组是一个连续的内存块。通过访问数组越界,您只需访问数组末尾之外的内存。访问这样的存储器将做的是非确定性的,它可能是垃圾,它可能属于相邻变量,或者它可能属于调用函数的变量或以上。它可能是当前函数的返回地址或调用函数。在受内存保护的操作系统(如Windows或Linux)中,如果您访问的区域不再超出分配给该进程的地址范围,则会发生故障异常。