得到"分割失败" strrev函数实现中的错误

时间:2011-12-09 16:09:36

标签: c

void main() { 
    void strrev(char *); 
    char *p="GOOd";
    strrev(p);
    printf("%s",p);
}

void strrev(char *str) { 
    char temp, *end_ptr;
    if( str == NULL || !(*str) ) return;
    end_ptr = str + strlen(str) - 1;

    while( end_ptr > str ) 
    { 
        temp = *str; 
        *str = *end_ptr; 
        *end_ptr = temp; str++; 
        end_ptr--; 
    } 
}

我收到错误分段失败,任何人都可以帮我解决问题...

2 个答案:

答案 0 :(得分:8)

声明:

char *p = "GOOd";

定义一个字符串文字“GOOD”,由指针p指向。

您正尝试通过strrev函数修改此字符串文字,从而导致未定义行为(UB)以及崩溃。

字符串文字的问题是它们存储在只读(实现定义的)内存位置,并且不允许用户程序更改它。如果程序试图这样做,则会导致UB。

因此,不应使用字符串文字。您应该使用数组。

您应该使用:

char p[] = "GOOd";

答案 1 :(得分:5)

以下是一个问题:

char *p = "GOOd";

允许编译器将字符串文字放在只读存储器中。

任何修改p指向的字符串的尝试都会导致未定义的行为。

尝试将上述行更改为:

char p[] = "GOOd";

我认为strrev()函数本身没有任何问题。