以下是我如何显示字符串" 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;
}
答案 0 :(得分:4)
在C中,因为尝试修改字符串文字是被认为是未定义行为的事情之一。
原始字符串修改在原始C标准中被标记为未定义行为的原因(请记住,ANSI / ISO C标准组织的原始意图是编纂现有实践而不是发明新语言)是因为某些实现当时存在的字符串文字存储在只读存储器中,或共享相同的字符串文字以减少内存使用。
并且,由于在该点之后标准的每次迭代都重视向后兼容性(并且某些实现可能仍然优化空间或保护字符串文字免于意外损坏),因此并不真实渴望改变它。
底线,未定义的行为通常很糟糕,不要这样做。