C语言的常见陷阱及注意事项总结

让循环变成死循环的N种方法

  • 循环种类

      For循环  while循环,do while 循环,goto 语句

  1. 把循环无意中变成死循环案例
  2. for循环执行步骤

执行步骤说明略

错误案例

unsigned char i;

for(i=0;<i<257;i++){}

死循环

void fun(unsigned int N){

unsigned char i;

for(i=0;i<N;i++){}}有时会出现死循环

unsigned char i;

for(i=0;i<10;i++){i--}死循环

unsigned char i;

for(i=0;i<10;i++){i=fun()}赋值后的值(很有可能不是循环10次)

unsigned char i;

for(i=0;i<5;i<<=1){}死循环

unsigned short i;

unsigned char A;

for(i=0x01;i!=0;i<<=1) {  A |=i;  }后面八次的结果没变化,位宽的原因

unsigned char i;

for(;i>0;i++){};i=0

unsigned char i;

for(;i>0;i--){};i=0

unsigned char i;

for(i=0x80;i!=0;i>>1){};一直是128,没有改变i的值

unsigned char i;

for (i = 100; i >= 0; i--); 死循环

unsigned char i;

for (i = 99; i >= 0; i-=2); 死循环

unsigned char i;

for (i = 1; i != 0; i+=2); 死循环

for(int i=0;i<5;i++)
printf("abcd");

for(int i=0;i<5;i++);只进行了上面的for循环
printf("abcd");

  1. While 和 do while
  2. 执行步骤

错误案例

unsigned char i;

While(i--) {i+=2;}While——》while

unsigned char i=5;

While(i-=2) {}While——》while  修改后循环

void fun(unsigned int N)

{

 while(--N){}

}看似没问题

unsigned char i=5;

While(i--) {}

if(i==0)return ;While——》while ,return一个值?

unsigned char i=5;

  do{

   i++;

  }while(i<=1000);一直循环做i++

  void fun(unsigned int i)

  {

  do{

   i+=2;

  }while(i==100);

  }只存在i==98的时候才执行do一次

  void fun(unsigned int i)

  {

  do{

   i+=2;

  }while(i!=100);

  }只存在i!=98的时候才执行do一次

goto语句

 void fun(int N,int N1)

 {

  unsigned char i=0;

 begin:

      i++;

  ------

  if(i==N1) goto end;

  if(i<N) goto begin;

    ----

 end:

  return;

 }当N1>N的时候可以执行begin的操作,但N1<N时,直接跳出end

让数组溢出的N种方式

unsigned char buff[1024];

Buff[1024]=0x05;没有buff[1024]

unsigned char buff[1024];

 for(int i=0;i<=1024;i++)

 {

  buff[i]=1;

 }

还是i==1024时,没有buff[1024]

unsigned char buff[1024];

void fun(int N)

{

 for(int i=0;i<=N;i++)

 {

  buff[i]=1;

 }

}i是否为1024及以上

unsigned int index=0;

unsigned char buff[1024];

void uart_intterrupt(void)//中断函数

{

  index ++;

}

void main(void)

{

 while(1)

 {

  buff[index]=1;

 }

}index是字符串内置函数

让指针跑飞的技巧

 unsigned char buff[1024];

 void fun(unsigned char *in)

 {

 unsigned char *p;

 p=in;

 for(int i=0;i<=1024;i++)

 {

  *p++=0x55;

 }

 }

 void main(void)

 {

  fun(buff-4);指向别的空间,值全是0

  fun(buff);

  fun(buff+4);这个指针跑飞,为什么会从55变成ff呢

  fun(0);NULL的情况下回跑飞

 }

 unsigned char buff1[16];

 unsigned char buff2[16];

 void fun(unsigned char **in)

 {

      **in = 0x55;

      **in++=0x66;

 }

 void main(void)

 {

   unsigned char *p1;

   unsigned char *p2;

   p1=buff1;

   p2=buff2;

   fun(&p1);

   fun(&p2);

 }不太清楚

unsigned char buff[1024];

void fun1(unsigned char *in

{

 unsigned int *p;

 p=in;

 for(int i=0;i<1024;i++)

 {

  *p++=1;

 }

}

void fun2(unsigned char *in

{

 unsigned char *p;

 p=in;

 for(int i=0;i<1024;i++)

 {

  *p++=2;

 }

}

void main(void)

{

fun1(buff);

fun2(buff);

}括号有问题,

 unsigned char *buff[16];

 unsigned char  buffindex=0;

 unsigned short *Var;

 unsigned char *buff2[16];

  void inttertupt_fun(void)

 {

  buff[buffindex++]=0;

 }

 void main(void)

 {

  Var=buff2;

  ----

  while(1)

  {

  *Var=5;

  }

  ----

 }不明白

typedef struct STR__

{

u8 a;

}str;

void * fun(u8 *p)

{

  str teg;

  teg.a=*p;

 return  &teg;

}

void main(void)

{

    u8 a=5;

    str *p;

    p= (str *)fun(&a);

    *p++;

} u8在QT的头文件是什么

备份:

#define u8  unsigned char

#define u64 unsigned long

typedef struct STR__

{

    ua;

}str;

void * fun(u64 *p)

{

      str *teg;

      teg->a=*p;

     return teg;

}

void main(void)

{

    u8 a=5;

    printf("a=%p\n",&a);

    str *p;

    p= (str *)fun(&a);

    printf("p = %x\n",p->a);

    *p++;

}

如何体现函数指针让程序死掉的能力

Typedef void (*fun_callback)(unsigned char *buff,unsigned char in) ;

typedef  struct ID_Dealwith

{

unsigned short  ID;

fun_callback    ID_Dealwith_fun;

}IDD_;

IDD_ IDD[4]=

{

{0x9000,ID9000},

{0x9001,ID9001},

{0,0},

{0x9003,0x1800000},

};

void ID9000(unsigned char *buff,unsigned char in)

{

}

void ID9001(unsigned char *buff,unsigned char in)

{

}

void ID_Dealwith(unsigned short ID,unsigned char *buff,unsigned char in)

{

unsigned char i=0;

for(;i<4;i++)

{

if(ID==IDD[i].ID)

{

IDD[i].ID_Dealwith_fun(buff,in);

}

}

}

  1. 定义的变量,所在位置,变量赋值的失败
  2. 函数入参,所在位置,使用中需要注意哪些情况

     

unsigned char a;

#define HH  1024

u8 buff[1024];

const u8 table[8]={0x15,0x16,0x17,0x18,0x15,0x16,0x17,0x18}

void  * fun(u8 a,u8 *p,u16 c,u32 d,u32 *dp)

{

static u16 Up[32];

u8 Dw[1024];

u8 *p=malloc(1024);//去掉u8 *,在malloc前面加强制转换u8*

for(u8 i=0;i<d;i++)

{

Dw[i]=dp[i];

}

return Up;

}

讨论 每个变量,存放的位置

struct a_

{

u8 aa;

u8 bb;

};

void get_fun(struct a_ sa)

{

sa.aa=1;

sa.bb=2;

}

void main(void)

{

struct a_ dd;

get_fun(dd);

}

dd 的值赋值多少

  1. 中断哪点事儿
  2. 中断过程

unsigned int DD=0;

unsigned char rb[128];

void  intterrupt_fun(void)

{

DD++;

}

void main(void)

{

  unsigned int i;

  DD=0;

  for(i=0;i<128;i++)

  {

rb[DD++]=i;

  }

}

  unsigned int DD=0;

unsigned char rb[128];

#define IIC_DATA_H P_1

#define IIC_DATA_L P_0

#define IIC_CLK_H  C_1

#define IIC_CLK_L  C_0

unsigend char iic_write(u8 addr,u8 data)

{

u8 i;

IIC_CLK_L;

for(i=0x80;i!=0;i>>=1)

{

if(i & data)IIC_DATA_H;

else        IIC_DATA_L;

IIC_CLK_H;

IIC_CLK_L;

}

}

unsigend char iic_read(u8 addr,u8 data)//漏了

{

u8 i;

IIC_CLK_L;

for(i=0x80;i!=0;i>>=1)

{

if(i & data)IIC_DATA_H;

else        IIC_DATA_L;

IIC_CLK_H;

IIC_CLK_L;

}

}

void  intterrupt_fun1(void)

{

    for(i=0;i<16;i++)

iic_write(i,rb[i]);

}

void  intterrupt_fun2(void)

{

    for(i=0;i<16;i++)

rb[i]=iic_Read(i);

}

void main(void)

{

  while(1)

  {

  }

}

结构体和公用体,能干的坏事?

伪指令的作用

#define AA 5+8

Bb=1

u16 aa=bb*AA;

#ifdef DDR1

#define  DDR1EN 1

#else

#define  DDR1EN 0

#endif

#ifdef DDR2

#define  DDR2EN 1

#else

#define  DDR2EN 0

#endif

#ifdef DDR3

#define  DDR3EN 1

#else

#define  DDR3EN 0

#endif

#ifdef DDRA1

#define  DDRA1EN 1

#else

#define  DDRA1EN 0

#endif

#ifdef DDRA2

   #define  DDRA2EN 1

#else

#define  DDRA2EN 0

#endif

#define  DDRNUM   (DDR1EN+DDR2EN+DDR3EN+DDRA1EN+DDRA2EN)

#if DDR1 == 1

#endif

位操作的迷惑

u16 fun1(u8 a,u8 b)

{

u16 r;

r = a << 8+b;

return r;

}r=b

unsigned char rb[1024];

void fun(unsigned short  packsno)

{

unsigned short i_byte;

unsigned char i_bit;

i_byte = (unsigned short)(packsno >> 3);

i_bit = (unsigned char)(packsno & 7);

i_bit = (unsigned char)(0x01 << i_bit);

rb[i_byte] |= i_bit;

}

  I &= ~0x01;

猜你喜欢

转载自blog.csdn.net/weixin_41895751/article/details/129081921
今日推荐