欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一维/二维数组边缘操作实验

程序员文章站 2024-02-04 09:00:28
...

      我们在使用数组编程时, 往往会对数组的访问范围格外留心.  一般地, 我们会认为只要数组越界访问, 程序就会报错——其实不然, 有时越界访问也不会造成程序的崩溃. 值得强调的是, 我并不是在鼓励朋友们越界访问数组, 而是想让大家正视这一问题, 并在模拟越界访问现场时理解数组访问操作的实质. 事实上, 越界访问数组绝不是一种好的编程习惯, 甚至可以说"糟糕", 因为合法范围外的存储单元中的数据是未知的, 这些存储单元的作用也是未知的, 如果我们随意修改这些数据, 其造成的后果是不可估量的. 

      下面这个程序给出了越界访问操作的实例: 从程序的运行结果来看, 编译器为变量i、a、c和数组b分配了连续的存储空间, 根据程序运行结果中的内存地址可画出下面的内存地址对应图. 程序在运行期间, 从0060FEE0存储单元开始, 顺序修改各内存单元存储的数值(int型变量占4个字节, 而内存按字节编址, 所以每个int型变量占4个存储单元). 在程序结束前, 从0060FEE0到0060FF00的9个存储块中的值都被修改过. 碰巧的是, 程序运行时对变量i的修改未影响循环的正确结束. 这里多想一步, 这次只是碰巧, 在一般情况下, 这种性质的操作极有可能给程序的运行带来负面的影响.

#include<stdio.h>
/* 此程序无任何实际意义 */
int main()
{
    int i, a = 1, c = 2, b[5] = {0};
    printf("%p  %p  %p  %p\n", b, &c, &a, &i);
    i = 0;
    while(i <= 8)
    {
        b[i] = i;
        printf("%d  ", b[i]);
        i ++;
    }
    printf("\n");
    printf("c = %d, a = %d, i = %d\n", c