在strrev函数实现中获得"分段失败"错误

sar*_*man 5 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--; 
    } 
}
Run Code Online (Sandbox Code Playgroud)

我得到错误分割失败可以任何人帮助我如何解决它...

Alo*_*ave 8

该声明:

char *p = "GOOd";
Run Code Online (Sandbox Code Playgroud)

定义由指针指向的字符串文字"GOOD" p.

您正在尝试通过strrev导致未定义行为(UB)和崩溃的函数修改此字符串文字.

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

因此,不应使用字符串文字,而应使用数组.

你应该使用:

char p[] = "GOOd";
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 5

一个问题是以下内容:

char *p = "GOOd";
Run Code Online (Sandbox Code Playgroud)

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

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

尝试将以上行更改为:

char p[] = "GOOd";
Run Code Online (Sandbox Code Playgroud)

我没有看到strrev()函数本身有任何问题.