繁体   English   中英

提供正确的输出后,C程序意外崩溃

[英]C program unexpectedly crashes after giving correct output

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

谢谢。

在您的swap()函数中,问自己:

void swap(char* a, char* b){
  char* temp;

问: temp现在指向哪里?
答:未知,可能在某个地方很危险。

*temp = *a;

但是我们只是在那个地方写了一些东西。

而是使用char

void swap(char* a, char* b){
  char temp;

  temp = *a;
  *a = *b;
  *b = temp;
}

您调用未定义的行为,这就是代码似乎可以正常运行的原因,但是它实际上并没有正常工作,这是您遇到的问题

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);
    }
}

这没有什么意义,但也可以使用,要点是向您显示使用间接运算符* ,指针必须有效。

因此,程序崩溃的原因是无效的指针取消引用导致的未定义行为。

在交换函数中,要么使用int temp,要么使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM