为什么我可以通过传递变量但不传递真正的字符串来反转字符串? (简单代码)

时间:2016-07-05 02:37:28

标签: c string function reversing

以下是我如何显示字符串" dcba":

main()
{
    char s[10] = "abcd";
    puts(strrev(s));
}

我如何获得"分段错误" (为什么?):

puts(strrev("abcd"));

这是反转字符串的函数:

char *strrev(char *s)
{
    int i, j;
    char aux;

    for(i=0, j=strlen(s)-1; i<j; i++, j--)
    {
        aux = s[j];
        s[j] = s[i];
        s[i] = aux;
    }

    return s;
}

1 个答案:

答案 0 :(得分:4)

在C中,因为尝试修改字符串文字是被认为是未定义行为的事情之一。

原始字符串修改在原始C标准中被标记为未定义行为的原因(请记住,ANSI / ISO C标准组织的原始意图是编纂现有实践而不是发明新语言)是因为某些实现当时存在的字符串文字存储在只读存储器中,或共享相同的字符串文字以减少内存使用。

并且,由于在该点之后标准的每次迭代都重视向后兼容性(并且某些实现可能仍然优化空间或保护字符串文字免于意外损坏),因此并不真实渴望改变它。

底线,未定义的行为通常很糟糕,不要这样做。