您的位置:首页 > 其它

工作中问题整理1----使用scanf出现的奇怪内存越界问题

2015-07-31 11:30 543 查看
今天帮同事处理一个问题,发现原来是内存越界问题:

问题描述:

使用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进行读写文件将会出错


进一步说明:

根据系统支持大小端字节序,结果又会有不同


同事遇到的是第二种错误




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: