字符串翻转,出现Segmention fault, 怎么解决
代码是实现字符串的翻转,先用一个指针移动到尾部,然后一头一尾两个指针交换数据,相互靠拢
结果出现Segmention fault
上代码
#include <stdio.h>
void reverse(char *str) {
char *start = str;
char temp = ' ';
while(*str++);
if (start == str)
return;
str--;
while (start < str) {
temp = *start;
*start = *str; //测试发现是这一行的原因,不知道为什么
*str = temp;
start++;
str--;
}
}
int main() {
char *str = "abcde";
reverse(str);
printf("%s\n", str);
}
[解决办法]
C 语言常见问题集
2.13 以下的初始化有什么区别?char a[] = "string literal"; char *p = "string literal"; 当我向 p[i] 赋值的时候, 我的 程序崩溃了。
字符串常量有两种稍有区别的用法。用作数组初始值 (如同在 char a[] 的声明中), 它指明该数组中字符的初始值。其它情况下, 它会转化为一个 无名的静态字符数组, 可能会存储在只读内存中, 这就是造成它不一定能被修改。 在表达式环境中, 数组通常被立即转化为一个指针 (参见第 6 章), 因此第二个声明把 p 初始化成 指向无名数组的第一个元素。
为了编译旧代码, 有的编译器有一个控制字符串是否可写的开关。
参见问题 1.11、 6.1、 6.2 和 6.6。
参考资料: [K&R2, Sec. 5.5 p. 104]; [ISO, Sec. 6.1.4, Sec. 6.5.7]; [Rationale, Sec. 3.1.4]; [H&S, Sec. 2.7.4 pp. 31-2]。