天天看点

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

今天帮同事处理一个问题,发现原来是内存越界问题:

问题描述:

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

进一步说明:

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

同事遇到的是第二种错误
           



继续阅读