Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4467037
  • 博文数量: 356
  • 博客积分: 10458
  • 博客等级: 上将
  • 技术积分: 4734
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-24 14:59
文章分类

全部博文(356)

文章存档

2020年(17)

2019年(9)

2018年(26)

2017年(5)

2016年(11)

2015年(20)

2014年(2)

2013年(17)

2012年(15)

2011年(4)

2010年(7)

2009年(14)

2008年(209)

分类: C/C++

2008-03-25 17:50:10

#include<iostream>
using namespace std;
void main(void)
{
    int in;
    cin >> in;
    int* array = new int(in);
    int i;
    for(i = 0; i != in; i++){
        int temp;
        cin >> temp;
        array[i] = temp;
    }
    for(i = 0; i != in; i++)
    cout << array[i] << " ";
    delete[] array;
    return;
}

已经new与delete了.但是运行后退出时出错:DAMAGE: After normal block ......

查了下网上的资料:
这样的错误主要是由内存越界操作导致堆栈被破坏引起的.我有一次申请了x大小的内存,却写入了x+y (y>0)的数据,结果导致了这样的错误。由于错误发生的地点与导致错误发生的地点不一定相邻,导致查找错误很困难,对于内存一定要小心再小心。其实大多数莫名其妙的错误都是由内存越界操作引起的

然后呢开始改:

 

#include<iostream>
using namespace std;
*void main(void)
{
    int in;
    cin >> in;
    int* array = new int(in);
    int i;
    for(i = 0; i != in-1; i++){
        int temp;
        cin >> temp;
        array[i] = temp;
    }
    for(i = 0; i != in-1; i++)
    cout << array[i] << " ";
    delete[] array; //有new必定要有delete 要不会内在泄漏的

    return;
}

 

我减一了  应该不会出错了吧  运行 还是同样的错误,郁闷下.
跟群里的编程爱好者讨论了下.
改成以下:

#include<iostream>
using namespace std;

void main(void)
{
    int in;
    cin >> in;
    int* one = new int(in);
        cout << one[0];
    // one[1] = 3;

    // cout << one[1]; // 这注释掉的两行如果不注释掉 照样会出现上面的问题的

        delete one;
    int* array = new int[in];
    int i;
    for(i = 0; i != in; i++){
        int temp;
        cin >> temp;
        array[i] = temp;
    }
    for(i = 0; i != in; i++)
    cout << array[i] << " ";
    delete []array;
        
    return;
}

这个程序没有错了.
对比下上面的,int* array = new int(in);    int* array = new int[in]; 这两处不同之处,就是()与[]了.
恍然大悟.

int* array = new int[in];这个才是正确的, 指针指向申请的一个数组单元首地址.
而int* array = new int(in); 这个呢 是申请一个int单元,存放值in.  而不是一个数组.所以会越界产生错误了.

结论: 不可粗心大意.
阅读(4678) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-09 11:12:31

杯具,哥也遇到了同样的问题

chinaunix网友2008-04-20 14:43:43

晕死,这结论够经典