让循环变成死循环的N种方法
- 循环种类
For循环 while循环,do while 循环,goto 语句
- 把循环无意中变成死循环案例
- 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++) for(int i=0;i<5;i++);只进行了上面的for循环 |
- While 和 do while
- 执行步骤
错误案例
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__ { u8 a; }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); } } } |
- 定义的变量,所在位置,变量赋值的失败
- 函数入参,所在位置,使用中需要注意哪些情况
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 的值赋值多少 |
- 中断哪点事儿
- 中断过程
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; |