关于在低级管理功能中解决UD的建议

时间:2011-05-16 18:12:59

标签: c pointers memory-management undefined-behavior chars

我对C很新,并且开始编写一个小型库,其功能是获取字符串长度,反转字符串,将char缓冲区中的二进制数据转换为int和short。只是为了教育并更好地掌握string.h等中已有的低级功能。

问题在于,我所拥有的错误在某种程度上是随机的。我有4个功能:

  • getStringLength (获取字符串的长度)
  • reverseString (使用XOR替换反转字符串并使用getStringLength获取长度)
  • charsToUShort (将二进制数据的两个字节(不计算空项)的char数组指针转换为无符号短文)
  • charsToUInt (将二进制数据的四个字节(不计算空名词)的char数组指针转换为unsigned int)

当我在main函数中测试所有这些函数时,基本上会出现问题。使用所有函数时, reverseString 中的迭代器将从0变为length / 2,并设置为32767。所以基本上当字符串的反转被迭代时,循环甚至不会启动,因为迭代器是32767。尽管它被初始化为0.如果我只使用其中的3个用于函数,例如,如果我删除charsToUInt我的主要功能它全部按预期工作。

主要问题

  • 您有什么建议来解决这样的问题?
  • 所有其他建议也非常欢迎!

易出错的代码澄清

getStringLength

unsigned int getStringLength(char *str){
    unsigned int i = 0;

    while(str[i]){
        i++;
    }

    return i;
}

reverseString

void reverseString(char *str){
    int i, m = 0;
    unsigned int l = getStringLength(str);

    m = l >> 1;

    while(i < m){
        str[i] ^= str[l - 1];
        str[l - 1] ^= str[i];
        str[i] ^= str[l - 1];
        i++;
        l--;
    }
}

charsToUShort

unsigned short charsToUShort(char *str){
    unsigned int l = getStringLength(str);
    unsigned short result = 0;

    if(l != 2){
        return 0;
    }else{
        result |= str[0] << 8;
        result |= str[1] << 0;
        return result;
    }
}

charsToUInt

unsigned int charsToUInt(char *str){
    unsigned int l = getStringLength(str);
    unsigned int result = 0;

    if(l != 4){
        return 0;
    }else{
        result |= str[0] << 24;
        result |= str[1] << 16;
        result |= str[2] << 8;
        result |= str[3] << 0;
        return result;
    }
}

测试输出以澄清

以下是测试的输出,错误结果为:

0: reverseString failed! Expected value: 'olleH', actual value: 'Hello'
1: charsToUShort passed! Expected value: '0x6261', actual value: '0x6261'
2: charsToUInt passed! Expected value: '0x62616364', actual value: '0x62616364'

这是预期的结果:

0: reverseString passed! Expected value: 'olleH', actual value: 'olleH'
1: charsToUShort passed! Expected value: '0x6261', actual value: '0x6261'
2: charsToUInt passed! Expected value: '0x62616364', actual value: '0x62616364'

1 个答案:

答案 0 :(得分:4)

您的代码仅将m设置为零,i未初始化,您需要int i = 0, m = 0;,否则循环将永远不会执行单次迭代