簡體   English   中英

程序收到信號 SIGSEGV,分段錯誤。 C++

[英]Program received signal SIGSEGV, Segmentation fault. C++

我在調試期間遇到此錯誤(*s = *end; line),同時嘗試使用指針反轉字符串。 我正在使用 Windows 10 操作系統,代碼塊 IDE 和 GDB 調試器。

#include <stdio.h>
#include <string.h>
#include <limits.h>

void myreverse(char* s);

int main()
{
    char* s1 = "1234";
    myreverse(s1);
    printf("%s", s1);
    return 0;
}

void myreverse(char* s) {
    char tmp;
    char* end = s + strlen(s) - 1;

    for(; s < end; s++, end--) {
        tmp = *s;
        *s = *end;
        *end = tmp;
    }
}

您應該將s1更改為char s1[] = "1234"; 因為您正在更改字符串。

然后在您的myreverse() function 中,您永遠不會使用tmp變量,這會使您的交換塊失敗。

固定的:

#include <cstdio>   // use the C++ versions of the header files
#include <cstring>

void myreverse(char* s) {
    char tmp;
    char* end = s + std::strlen(s) - 1;

    for(; s < end; s++, end--) {
        // swap
        tmp = *s;
        *s = *end;
        *end = tmp;   // use tmp
    }
}

int main() {
    char s1[] = "1234";
    myreverse(s1);
    printf("%s", s1);
}

請注意,交換塊中的 3 行可以替換為std::swap(*s, *end); 而且myreverse()可以完全替換為std::reverse(std::begin(s1), std::end(s1)); .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM