恋喵大鲤鱼 2018-05-16 13:56 采纳率: 100%
浏览 995
已采纳

缓冲溢出,为什么不报错?

#include
#include

#include
using namespace std;

int main()
{
char a[]={'1','2','3'};
cout<<sizeof(a)<<endl;
strcpy(a,"hel1234567891113");
cout<<a<<endl;
}

上面的代码可以顺利执行,并输出hel1234567891113,为什么不报错呢?

  • 写回答

9条回答 默认 最新

  • J4cks0n 2018-05-16 14:57
    关注

    这个跟编译器优化有关系的 我在vs里工作在debug模式时是会报异常的
    图片说明
    但工作在release模式时就不会报异常了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • oyljerry 2018-05-16 14:21
    关注

    strcpy本身就不会做检查,所以就会有缓冲区溢出的问题,自然不会报错。你用strcpy_s API就会有运行时错误。

    评论
  • threenewbee 2018-05-16 14:25
    关注

    因为数组后面的内存不是很“重要”。
    好比在马路上开车,有的马路旁边有绿化带,有的马路边上就是墙。如果你碰巧在有绿化带的马路上开车,开出了界,那么可能问题不是很大。但是这显然是危险的。因为未必每次都没事。

    评论
  • lingdulebaishi 2018-05-17 01:36
    关注

    strcpy不会检查缓冲区溢出,需要用安全函数strcpy_s,缓存溢出问题可以通过valgrind等工具检测定位出来

    评论
  • randtest 2018-05-17 02:11
    关注

    strcpy函数不会检查长度,所以存在栈溢出风险。至于能够运行是编译优化选项有关。

    评论
  • weixin_39327518 2018-05-17 05:21
    关注

    有些程序在运行过程当中,会自动跳过一些错误的编程代码,也有可能是编程软件自身的问题。

    评论
  • qq_40127372 2018-05-17 08:46
    关注

    溢出在输出框里显示的是烫

    评论
  • chenpengllz 2018-05-17 08:48
    关注

    char a[]={'1','2','3'} 是用指针处理的,strcpy只是将dest放到src,不做长度判断

    评论
  • renh12 2018-05-20 09:22
    关注

    溢出错误是运行时错误,编译不会报错的,只有运行的时候才会出错,可以通过仿真来诊断出问题

    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥20 求完整顺利登陆QQ邮箱的python代码
  • ¥15 基带到底是什么?为什么手机厂和厂外完全两个概念
  • ¥15 怎么下载MySQL,怎么卸干净原来的MySQL
  • ¥15 网络打印机Ip地址自动获取出现问题
  • ¥15 求局部放电案例库,用于预测局部放电类型
  • ¥100 QT Open62541
  • ¥15 stata合并季度数据和日度数据
  • ¥15 谁能提供rabbitmq,erlang,socat压缩包,记住版本要对应
  • ¥15 Vue3 中使用 `vue-router` 只能跳转到主页面?
  • ¥15 用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色