C 获得;“分割失败”;strev函数实现中的错误

C 获得;“分割失败”;strev函数实现中的错误,c,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;

我得到的错误分割失败,谁能帮我解决它

声明:

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--; 
    } 
}
定义由指针
p
指向的字符串文字“GOOD”

您正试图通过
strev
函数修改此字符串文字,这将导致未定义行为(UB)和崩溃

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

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

您应该使用:

char *p = "GOOd";

其中一个问题是:

char p[] = "GOOd";
允许编译器将字符串文本放在只读内存中

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

尝试将上面的行更改为:

char *p = "GOOd";

我看不出strev()函数本身有任何问题。

谢谢你这么做。。。但是我应该从这个错误中学到什么呢。。。甚至还有多少其他情况会出现这种错误(UB)?@S.A.Rahman:有很多情况会导致UB。C标准明确提到了这一点,但我认为经验是解决这一问题的方法,你尝试一些事情,你陷入困境,试着发现错误,如果得不到任何帮助,请在这里提问。你犯了错误,通过实践,您将了解导致UB的常见情况。如果字符串定义为char*p=“GOOd”;那么标准库函数是如何操作的?@S.A.Rahman:这里要学习的重要概念是,如果你有一个指向字符串文字的指针,那么字符串就不能被修改,作为程序员,你的工作就是确保它不会通过指向它的指针被修改。这意味着,您不应该将这样的指针传递给任何试图修改指针指向的字符串的函数(标准库或您自己的函数),如果您像现在这样做,将不会有任何警告,只会出现UB和/或崩溃。您应该始终遵循这条规则,仅此而已。因此,字符串中的直接交换是不可能的?@S.a.Rahman:是的,只要您使用合适的方式为字符串分配内存(例如
charp[]=“GOOd”
malloc
/
strdup
)。
char p[] = "GOOd";