工作中问题整理1----使用scanf出现的奇怪内存越界问题
2015-07-31 11:30
543 查看
今天帮同事处理一个问题,发现原来是内存越界问题:
问题描述:
使用scanf输入int型的数据赋值给了char 类型的字符变量
如变量定义的顺序是
char num = 0;1个字节1个字节
CTRL_DATA data; //2个字节
memset(&data,0,sizeof(CTRL_DATA));
data.chn = 0;
int fd =open("a.txt",O_RDWR);//fd占4个字节
而scanf("%d",&nu);
将一个整数赋值给nu所在的内存单元,则会覆盖掉data 2个字节和fd的第一个字节
编译器不会检测scanf的类型错误,根据不同的平台执行时可能的两种情况
1、执行时出现段错误
2、fd的值改变,则后面使用fd进行读写文件将会出错
进一步说明:
根据系统支持大小端字节序,结果又会有不同
问题描述:
使用scanf输入int型的数据赋值给了char 类型的字符变量
#include<stdio.h> #include<stdlib.h> #include<fcntl.h> #include<memory.h> #include<unistd.h> typedef struct { unsigned char chn; unsigned char flag; } CTRL_DATA; int main(){ char nu = 0; CTRL_DATA data; memset(&data,0,sizeof(CTRL_DATA)); data.chn = 0; int fd =open("a.txt",O_RDWR); if(fd < 0) { printf("the DEV open failed\n"); return -1; } printf("before scanf fd = %d\n",fd); char buf[100]; while(1) { printf("input num:"); scanf("%d",&nu);//有问题 格式话字符为整数,nu为char类型; getchar();//读取换行符 switch(nu) { case 1: break; case 2: break; case 3: break; default: break; } sleep(1); printf("after scanf fd = %d\n",fd); //fd的值可能会改变 read(fd,buf,100);//可能会出错 } }
如变量定义的顺序是
char num = 0;1个字节1个字节
CTRL_DATA data; //2个字节
memset(&data,0,sizeof(CTRL_DATA));
data.chn = 0;
int fd =open("a.txt",O_RDWR);//fd占4个字节
而scanf("%d",&nu);
将一个整数赋值给nu所在的内存单元,则会覆盖掉data 2个字节和fd的第一个字节
编译器不会检测scanf的类型错误,根据不同的平台执行时可能的两种情况
1、执行时出现段错误
2、fd的值改变,则后面使用fd进行读写文件将会出错
进一步说明:
根据系统支持大小端字节序,结果又会有不同
同事遇到的是第二种错误
相关文章推荐
- 停靠窗口和工具栏
- CentOS Linux 修改 /etc/hostname 导致hadoop运行缓慢
- 在View页面,使用@if(){ }输出判断正确的内容
- 重做日志与归档日志的区别
- 10种常见的Java不规范代码
- Web项目:The requested resource is not available解决方法
- linux 跨机器文件相互拷贝:scp
- service的生命周期
- 日经春秋 20150731
- Android-倒计时工具类
- memset函数用法(转)
- Android端与Java服务端交互——SocketIO
- 线程局部存储(TLS)
- 【剑指Offer面试题】 九度OJ1521:二叉树的镜像
- C++函数覆盖与重写
- 查询空文件夹
- Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead.解决方法
- HDOJ1022(模拟栈)
- 寻找最大数(贪心)
- 解读Android虚拟机工作原理