有人可以帮我理解第2行:char * end = str
和第4行: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;
}
}
}
答案 0 :(得分:4)
if (str)
测试可以防止您取消引用空指针并崩溃。
定义char *end = str;
定义变量end
,一个字符指针,并使用str
中存储的值对其进行初始化(这是{的第一个字符的地址{ {1}}指向)。
其余代码确定字符串的长度,然后安排从两端交换字符对,朝着字符串的中间工作。从技术上讲,如果传递一个空字符串(一个指向字符串末尾的空字节的指针),原始代码就不安全。那是因为它会在str
指向的字节之前将end
递减到一个字节。但是,无法保证字符串开头前一个字节的地址有效。该字符串可能指向内存页面的第一个字节,而前一页面从未被映射过,导致崩溃或其他问题。
最好使用str
来确定字符串的长度。
strlen()