记录:Warning C6385 : 从“p”中读取的数据无效: 可读大小为“n * sizeof(int)”个字节,但可能读取了“8”个字节。
官网解释:
警告 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”个字节。相关推荐
- mysql 获取下一条记录数,如何在MySQL中查询当前数据上一条和下一条的记录
如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from tab ...
- mysql查询两个表中的不同数据_如何实现大数据在多工作表中精准查询
大家好,今日继续讲解VBA数据库解决方案,今日讲解第40讲:利用ADO实现同一文件的多个工作表精确查询.其实这讲的内容利用我之前讲解的知识点也可以自己完成.这里只是拿出来让大家再熟悉一下EXCEL的A ...
- Qt TCP通信readAll()读取接收数据时无法读完大数据量的解决法案
在测试利用TCP传输图片的时候,服务器使用Qt的TCP类库.在TCP接收槽函数中使用readAll()成员函数的时候发现readAll()并不能读取全部的数据,比如,在客户端发送一张2MB的图像,但是 ...
- java下拉框读取数据库数据_在一个jsp页面实现二级下拉框联动,实时读取数据库数据...
在一个jsp(SUN企业级应用的首选)页面实现二级下拉框联动,实时读取数据库数据,这个方法非常使用,只需要修改很小的地方就可以使用.设计的文件,serch.jsp(SUN企业级应用的首选),main. ...
- C++“读取“大量数据时--快读
在一些算法题目中中,有的程序会被卡常数,就是说,程序虽然时间复杂度可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时.这是,快读就显得尤为重要了. 当然,如果程序算法本身就不高效,快 ...
- matlab imshow 多平面图像的输入项必须是大小为 MxNx3 的 RGB 图像,和imread读取路径以及特定路径修改
I = imread('smallcat.tif'); se = strel('ball',5,5) se = strel('ball',5,5) I2 = imdilate(I,se);%膨胀图像 ...
- C++ VS2019 缓存区溢出和读取数据无效的警告
人生不像做饭,不能等万事俱备了才下锅 今天在使用new创建动态数组时出现"缓存区溢出"和"读取数据无效"的警告,警告如下: 代码如下: void test(in ...
- 如何在QT中读取串口数据
总是能在别人的博客中学到太多太多,谢谢各位对知识的无私共享,谢谢大家 前言 去年我使用Qt编写串口通信程序时,将自己的学习过程写成了教程(Qt编写串口通信程序全程图文讲解),但是由于时间等原因,我只实 ...
- VS2019-C++警告-C6385读取数据无效
可读大小为size1字节,但size2字节可以读. C6385 | Microsoft Docshttps://docs.microsoft.com/zh-cn/cpp/code-quality/c6 ...
最新文章
- 【原】自定义UINavigationItem的两种方法以及相应的隐藏方法
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截...
- 牛客网数据开发题库_牛客网SQL题库NO.32~40
- matlab连接mysql数据库_matlab连接数据库的问题
- insert_text
- 征稿延期 | 2019亚洲语言处理国际大会(IALP2019)征稿延期
- 内核抢占机制(preempt)
- sigar 网络 java_java-Sigar网络速度
- vega56刷64_Vega56刷64的BIOS教程
- unity Curvy Splines基础操作:创建可视赛道
- Linux虚拟网络设备之bridge(桥)
- JMF的安装与环境的配置
- PingCAP 完成 D 轮 2.7 亿美元融资,创造全球数据库历史新的里程碑
- 用unionID作为oneID的实质:不管理账号和密码
- 天池大赛--ICPR Text Detection总结
- latex表格内容上下居中_LaTeX表格紧跟文字 (不影响下方文本对齐)
- Express搭建服务器
- 试毒水(阿里巴巴腾讯搜狐笔试智力题)
- 手把手教你pfx证书转pem
- linux禁用小企鹅输入法,小企鹅(fcitx)输入法停止开发