我在C中提出了以下用于反转字符串的解决方案:
#include <stdio.h>
void reverse(char * head);
void main() {
char * s = "sample text";
reverse(s);
printf("%s", s);
}
void reverse(char * head) {
char * end = head;
char tmp;
if (!head || !(*head)) return;
while(*end) ++end;
--end;
while (head < end) {
tmp = *head;
*head++ = *end;
*end-- = tmp;
}
}
但是我的解决方案是segfaulting。据GDB称,违规行如下:
*head++ = *end;
while循环的第一次迭代中的行段错误。 end指向字符串“t”的最后一个字符,head指向字符串的开头。那么为什么这不起作用呢?
答案 0 :(得分:32)
更改
char * s = "sample text";
要
char s[] = "sample text";
“示例文本”是一个字符串文字,可以位于地址空间的只读部分。使用数组语法可确保将此字符串复制到堆栈,这是可写的。
答案 1 :(得分:11)
您的s
指向字符串文字:
char * s = "sample text";
在函数reverse
中,您试图修改字符串文字,从而导致未定义的行为。
要修复此make s
char数组:
char s[] = "sample text";