【问题标题】:C program unexpectedly crashes after giving correct outputC 程序在给出正确输出后意外崩溃
【发布时间】:2015-01-09 14:36:59
【问题描述】:

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

它确实打印了正确的结果,但随后它给出了一个分段错误。它发生在主函数的“return 0”语句中。

您能帮我弄清楚为什么会发生 SEG FAULT。

谢谢。

【问题讨论】:

  • char* temp; 应该是char temp;

标签: c pointers segmentation-fault swap


【解决方案1】:

在您的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;
}

【讨论】:

  • 另外值得一提的是为什么您没有立即看到问题:代码将“工作”,并使用一些未知的内存位置来存储您的临时变量。但是,当您返回时,您将控制权交还给 C 运行时,它现在将您的字符写入其地址空间。我猜你覆盖了一个指针,运行时正试图访问它的地址空间之外。这就是为什么您只有在代码完成后才能看到错误。
【解决方案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);
    }
}

虽然意义不大,但也有效,重点是向您展示要使用间接运算符*,指针必须有效。

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

【讨论】:

    【解决方案3】:

    在交换功能中, 要么使用 国际温度;

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

    【讨论】:

    • 您的第二个交换示例将导致崩溃。您在 *temp = *a 中专门取消引用空指针
    • 我的错。我应该分配内存。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2023-03-30
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多