0

有人可以帮我理解 line2:char * end = str和 line4:if (str)做什么吗?

void reverse(char *str) { 
   char * end = str; 
   char tmp;
   if (str) {
      while (*end) { 
         ++end;
      }
      --end;
      while (str < end) {
         tmp = *str; 
         *str++ = *end; 
         *end-- = tmp;
      } 
   }
} 
4

1 回答 1

4

if (str)测试可保护您免于取消引用空指针和崩溃。

该定义char *end = str;定义了变量end,一个字符指针,并使用存储在其中的值str(这是str指向的字符串的第一个字符的地址)对其进行初始化。

其余代码确定字符串的长度,然后安排从两端交换字符对,朝着字符串的中间方向工作。从技术上讲,如果传递一个空字符串(指向字符串末尾的空字节的指针)原始代码是不安全的。那是因为它会在指向的end字节之前递减到一个字节str。但是,不能保证字符串开头前一个字节的地址是有效的。该字符串可能指向内存页的第一个字节,而前一页从未被映射,从而导致崩溃或其他问题。

最好用它strlen()来确定字符串的长度。

void reverse(char *str)
{ 
    if (str != 0 && *str != '\0') // Non-null pointer; non-empty string
    {
        char *end = str + strlen(str) - 1; 

        while (str < end)
        {
            char tmp = *str; 
            *str++ = *end; 
            *end-- = tmp;
        } 
    }
}
于 2013-11-08T06:40:51.200 回答