我在Ubuntu 14.0.4中使用GNU C. 我编写了一个CRC_XOR()函数,并使用相同的输入参数多次调用它.但它很奇怪,每次通话有时会得到不同的结果.出了什么问题?示例代码在这里:
#include <stdio.h>
#include <stdlib.h>
char CRC_XOR(char *as_Pkt,int ai_len);
void DO_Get_CRC(void);
int main(void)
{
DO_Get_CRC(); //get 01 00 02 03
DO_Get_CRC(); //get 01 00 02 03
DO_Get_CRC(); //get 01 00 02 00 (strange?)
DO_Get_CRC(); //get 01 00 02 03
DO_Get_CRC(); //get 01 00 02 00 (strange?)
DO_Get_CRC(); //get 01 00 02 03
DO_Get_CRC(); //get 01 00 02 00 (strange?)
exit(0);
}
/*
use same input to invoke CRC_XOR()
*/
void DO_Get_CRC(void)
{
char ls_pkt[20];
int li_idx;
short li_max = 512;
int li_len = 0;
ls_pkt[li_len++] = 0x01; //station ID
ls_pkt[li_len++] = 0x00; //length-low byte
ls_pkt[li_len++] = 0x02; //length-high byte
ls_pkt[li_len++] = CRC_XOR(ls_pkt,li_len);
ls_pkt[li_len] = 0;
for (li_idx=0; li_idx<li_len;li_idx++) {
printf("%02X ", ls_pkt[li_idx]); //display in hexdigits
}
printf("\n");
}
/*
return 1 byte of CRC by XOR byte array
*/
char CRC_XOR(char *as_Pkt,int ai_len)
{
int li_idx;
char lc_CRC = 0x00;
for (li_idx=0; li_idx < ai_len; li_idx++){
lc_CRC ^= as_Pkt[li_idx]; //XOR each byte
}
return (char)(lc_CRC & 0x000000FF); //return CRC byte
}
Run Code Online (Sandbox Code Playgroud)
你有未定义的行为.
原因是因为没有带有赋值的序列点.
对于
ls_pkt[li_len++] = CRC_XOR(ls_pkt,li_len);
Run Code Online (Sandbox Code Playgroud)
你不知道在函数调用中li_len++
评估之前或之后是否发生过li_len
.反过来可能意味着li_len
可能等于4
哪个意味着你的CRC_XOR
函数将使用尚未初始化的函数ls_pkt[4]
.
由于ls_pkt[4]
在分配之前未初始化,因此其值将是不确定的,并且可能看似随机.
简单的解决方案是在分配li_len
后增加:
ls_pkt[li_len] = CRC_XOR(ls_pkt,li_len);
++li_len;
Run Code Online (Sandbox Code Playgroud)