官网解释:
警告 C6385:无效数据:访问buffer-name,可读大小为size1字节,但size2字节可以读取:行:x、y
缓冲区的可读范围可能小于用于从缓冲区读取的索引。 尝试读取有效范围外的数据会导致缓冲区溢出。

源程序(已改正,警告语句在注释行):

#include<stdio.h>
#include<stdlib.h>
int main()
{int n, i, * p;printf("请输入要处理的数据个数:");scanf_s("%d", &n);p = malloc(n * sizeof(int));if (p == NULL){printf("不能成功分配存储空间。");exit(1);}printf("请输入%d个数据:\n", n);for (i = 0; i < n; i++)       //输入数据{scanf_s("%d", p + i);}for (i = 0; i < n; i++)       //输出数据{//printf("%4d", p[i]); //Warning C6385printf("%4d", *(p + i));}free(p);return 0;
}

从官网给出的解释中,我们可以知道 "printf("%4d", p[i]);" 语句中存在的主要错误是,p[i]存在访问越界的风险。
在一开始时,我直接在网上搜索"Warning C6385"查阅资料,大多资料都是讲了跟官网解释差不多的内容,收获甚微。
然后我就自己推理代码。即然是缓冲区溢出问题,那我就从输入数据、输出数据这两处代码推断。

for (i = 0; i < n; i++)        //输入数据
{scanf_s("%d", p + i);
}
for (i = 0; i < n; i++)       //输出数据
{printf("%4d", p[i]);
}

推理过程:输入、输出两个for 循环中,有3个变量:循环变量i、处理数据个数n、指针变量p 。
          可以看出 n 是循环控制变量。
          当 n = 1,第一个for 循环往 p 指向的地址输入一个数;
                          第二个for 循环输出p[0]里的数据;
          当 n = 2,第一个for 循环往 p、p+1 指向的地址分别输入一个数;
                          第二个for 循环输出p[0]、p[1]里的数据;
          推到n = 2,我就感觉不对劲,输入1个数据拿出1个数据,输入2个数据拿出2个数据,
          这都一一对应的,怎么会访问越界呢?突然我看到两个for 循环的引用方法是不一样
          的,输入for 循环里,用的是指针法"p+i";输出for 循环里,用的是下标法"p[i]"
          然后,我把输出for 循环也改用指针法"*(p+i)",警告消失!
          问题就出在下标法"p[i]"上,像数组一样在连续内存空间存储的多个数据才使用下标法,
          该程序中,当n = 1时,才只存入一个数据,一个数据显然不能构成数组
          这就是官方解释所说的:缓冲区的可读范围可能小于用于从缓冲区读取的索引。
          可读范围是1个数据,索引是p[0](首地址),要构成首地址,那么索引后至少应有1个数据,
          索引本身也存储一个数据,因此可读范围 "1个数据" < "p[0]" + "1个数据"。

记录:Warning C6385 : 从“p”中读取的数据无效: 可读大小为“n * sizeof(int)”个字节,但可能读取了“8”个字节。相关推荐

  1. mysql 获取下一条记录数,如何在MySQL中查询当前数据上一条和下一条的记录

    如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from tab ...

  2. mysql查询两个表中的不同数据_如何实现大数据在多工作表中精准查询

    大家好,今日继续讲解VBA数据库解决方案,今日讲解第40讲:利用ADO实现同一文件的多个工作表精确查询.其实这讲的内容利用我之前讲解的知识点也可以自己完成.这里只是拿出来让大家再熟悉一下EXCEL的A ...

  3. Qt TCP通信readAll()读取接收数据时无法读完大数据量的解决法案

    在测试利用TCP传输图片的时候,服务器使用Qt的TCP类库.在TCP接收槽函数中使用readAll()成员函数的时候发现readAll()并不能读取全部的数据,比如,在客户端发送一张2MB的图像,但是 ...

  4. java下拉框读取数据库数据_在一个jsp页面实现二级下拉框联动,实时读取数据库数据...

    在一个jsp(SUN企业级应用的首选)页面实现二级下拉框联动,实时读取数据库数据,这个方法非常使用,只需要修改很小的地方就可以使用.设计的文件,serch.jsp(SUN企业级应用的首选),main. ...

  5. C++“读取“大量数据时--快读

    在一些算法题目中中,有的程序会被卡常数,就是说,程序虽然时间复杂度可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时.这是,快读就显得尤为重要了. 当然,如果程序算法本身就不高效,快 ...

  6. matlab imshow 多平面图像的输入项必须是大小为 MxNx3 的 RGB 图像,和imread读取路径以及特定路径修改

    I = imread('smallcat.tif'); se = strel('ball',5,5) se = strel('ball',5,5) I2 = imdilate(I,se);%膨胀图像 ...

  7. C++ VS2019 缓存区溢出和读取数据无效的警告

    人生不像做饭,不能等万事俱备了才下锅 今天在使用new创建动态数组时出现"缓存区溢出"和"读取数据无效"的警告,警告如下: 代码如下: void test(in ...

  8. 如何在QT中读取串口数据

    总是能在别人的博客中学到太多太多,谢谢各位对知识的无私共享,谢谢大家 前言 去年我使用Qt编写串口通信程序时,将自己的学习过程写成了教程(Qt编写串口通信程序全程图文讲解),但是由于时间等原因,我只实 ...

  9. VS2019-C++警告-C6385读取数据无效

    可读大小为size1字节,但size2字节可以读. C6385 | Microsoft Docshttps://docs.microsoft.com/zh-cn/cpp/code-quality/c6 ...

最新文章

  1. 【原】自定义UINavigationItem的两种方法以及相应的隐藏方法
  2. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截...
  3. 牛客网数据开发题库_牛客网SQL题库NO.32~40
  4. matlab连接mysql数据库_matlab连接数据库的问题
  5. insert_text
  6. 征稿延期 | 2019亚洲语言处理国际大会(IALP2019)征稿延期
  7. 内核抢占机制(preempt)
  8. sigar 网络 java_java-Sigar网络速度
  9. vega56刷64_Vega56刷64的BIOS教程
  10. unity Curvy Splines基础操作:创建可视赛道
  11. Linux虚拟网络设备之bridge(桥)
  12. JMF的安装与环境的配置
  13. PingCAP 完成 D 轮 2.7 亿美元融资,创造全球数据库历史新的里程碑
  14. 用unionID作为oneID的实质:不管理账号和密码
  15. 天池大赛--ICPR Text Detection总结
  16. latex表格内容上下居中_LaTeX表格紧跟文字 (不影响下方文本对齐)
  17. Express搭建服务器
  18. 试毒水(阿里巴巴腾讯搜狐笔试智力题)
  19. 手把手教你pfx证书转pem
  20. linux禁用小企鹅输入法,小企鹅(fcitx)输入法停止开发

热门文章

  1. 消费金融业务模式结构图
  2. python制作在线答题app_如何做线上答题APP、线上答题APP都有哪些功能呢?
  3. Tableau学习笔记⑥(多边形地图、设置地理信息、背景图地图)
  4. 【转】ROC曲线与AUC值
  5. mac下#include nested too deeply错误处理
  6. 经纬财富:六安何克服操盘时的恐惧心理?
  7. uniapp 区分环境运行、打包
  8. CH 1 Greenfoot初体验
  9. C++ 判断是否存在Emjoi表情
  10. Lambda表达式和SteamAPI