溯流而上 2018-04-13 04:02 采纳率: 50%
浏览 3813
已采纳

有点疑惑,c++中int*p=new int[0]动态分配了多大的内存,求不吝赐教

 int main()
{
    int *ptr=new int[0];
    ptr[0]=1;
    ptr[1]=2;
    cout<<"ptr[0]:"<<ptr[0]<<endl;
    cout<<"ptr[1]:"<<ptr[1]<<endl;
    for(int i=0;i<6;i++)
    {
        ptr[i]=i+1;

    }
    for(int i=0;i<6;i++)
    {
        cout<<ptr[i]<<"\t";

    }
    cout<<endl;
    system("pause");
    return 0;
}

访问ptr[6]程序会中断,疑惑new int[0]分配了多大的空间,在什么情况下会访问越界,在vs2013下编译的

  • 写回答

9条回答 默认 最新

  • tang_cheng 2018-04-13 07:22
    关注

    new分配的时候,一般会分配除了它本身大小以外的内存头和内存尾,一般形式为:[内存头][可用数据][内存尾]。
    而你的ptr指针返回的是[可用数据]部分的起始地址。大部分编译器在用户分配的size为0的情况下,会自动分配1字节的可用内存,
    以保证返回的ptr是一个合法的指针。但是,C/C++是一个从来都不校验内存溢出的语言。因此,你可以访问任意从ptr开始的地址的数据,
    如果你访问的地址正巧有数据,则这个数据就会被访问到,如果正好这个地址没分配数据,才会抛出异常。但是如果你在ptr指向的任意地址
    中写了数据,且地址已经超过了可用数据的范围,则会有两种情况发生:如果该地址没有分配数据,则你很幸运,系统会直接抛出异常。
    如果该地址有数据(比如内存尾或其他分配的数据),则会让你写入,并不报任何错误,但是在程序运行到需要读取你写的数据部分时候会发生
    你所以为的莫名其妙的错误。这时候要去排查错误,那可真是想死的心都有了。这也是C/C++中最难控制的部分。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效