我正在尝试编写一个简单的C程序来反转字符串。代码如下:
void swap(char* a, char* b){
char* temp;
*temp = *a;
*a = *b;
*b = *temp;
}
char* reverseString(char* str){
int length = strlen(str);
int i=0;
for(i=0; i<(length/2); i++){
swap(&str[i], &str[length-i-1]);
}
return str;
}
int main(){
char str[] = "Hello World";
reverseString(str);
printf("%s\n",str);
return 0;
}
它确实打印出正确的结果,然后它发出了一个SEGMENTATION FAULT。它发生在主函数的“return 0”语句中。
你能帮我弄清楚为什么会出现SEG FAULT。
感谢。
答案 0 :(得分:7)
在swap()
函数中,问问自己:
void swap(char* a, char* b){
char* temp;
问: temp
现在指向何处?
A:未知,可能是危险的。
*temp = *a;
然而我们只是在那个地方写了一些东西。
相反,请使用char
:
void swap(char* a, char* b){
char temp;
temp = *a;
*a = *b;
*b = temp;
}
答案 1 :(得分:2)
你调用了未定义的行为,这就是为什么代码看起来有效,但它没有真正正常工作,你这里有问题
void swap(char* a, char* b) {
char *temp;
*temp = *a;
*a = *b;
*b = *temp;
}
你将temp
声明为char
指针,然后你取消引用它,因为它是一个无效的指针,正确的方法是
void swap(char* a, char* b) {
char temp;
temp = *a;
*a = *b;
*b = temp;
}
你也可以这样做
void swap(char* a, char* b) {
char temp[1];
*temp = *a;
*a = *b;
*b = *temp;
}
这没有多大意义,但可行,或者你甚至可以这样做
void swap(char* a, char* b) {
char *temp;
temp = malloc(1);
if (temp != NULL)
{
*temp = *a;
*a = *b;
*b = *temp;
free(temp);
}
}
这样做的意义不大但也有效,重点是告诉你要使用间接运算符*
,指针必须有效。
因此,程序崩溃的原因是由指针取消引用无效引起的未定义行为。
答案 2 :(得分:0)
在交换功能中, 要么使用 int temp;
void swap(char *a, char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
或设置int * temp = NULL,使其不指向未知内存。
void swap(char *a, char *b)
{
char *temp = NULL;
*temp = *a;
*a = *b;
*b = *temp;
}