2

我有以下简单的功能:

void reverse(char* str) {
    if (str == NULL)
        return;
    char* end = str;
    while(*end != NULL) {
        end++;
    }
    end--;  
    while(str < end){
        char temp = *str;
        *str++ = *end;
        *end-- = temp;
    }   
}

int main(int argc, char* argv[]) {
    char* second = "SOMETHING\0";
    cout << "Before Reverse String: " << second << '\n';
    reverse(second);
    cout << "Reverse String: " << second << '\n';
}

很简单,对吧?但是我在行中遇到了分段错误

*str++ = *end 
*end-- = temp

我错过了什么?

谢谢!

4

2 回答 2

0

改变

char* second = "SOMETHING\0";

char second[] = "SOMETHING";

注意:字符串文字不可修改,您不必显式添加\0字符串文字。

while(*end != NULL) {

应该

while(*end != '\0') {

NULL仅用于空指针。

于 2013-07-17T03:35:13.360 回答
0

您正在修改字符串文字:

char* second = "SOMETHING\0";

这是未定义的行为,一种解决方案是将文字分配给 char 数组:

char second[] = "SOMETHING";

此外,字符串文字将以 NULL 结尾,因此不需要添加\0. 您还应该修改您的 while 循环以与\0而不是进行比较NULL。虽然,它应该可以工作,因为它们都将评估为,0因为*endchar读起来更好用\0

while(*end != '\0')
于 2013-07-17T03:37:16.957 回答