工作中问题整理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进行读写文件将会出错

进一步说明:
根据系统支持大小端字节序,结果又会有不同


同事遇到的是第二种错误
 



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值