使用相同的输入多次调用函数,但获得不同的返回值

Vic*_*ang 2 c crc xor

我在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)

Som*_*ude 8

你有未定义的行为.

原因是因为没有带有赋值的序列点.

对于

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)