0

这是显示字符串“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;
}
4

1 回答 1

4

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

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

而且,由于该点之后标准的每次迭代都重视向后兼容性(并且某些实现可能仍会针对空间进行优化或保护字符串文字免受意外损坏),因此并没有真正想要更改它。

底线,未定义的行为通常是不好的,不要这样做。

于 2016-07-05T02:44:29.197 回答