在给出正确的输出后,C程序意外崩溃

时间:2015-01-09 14:37:00

标签: c pointers segmentation-fault swap

我正在尝试编写一个简单的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。

感谢。

3 个答案:

答案 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;
}