C++ 中的字符串反转得到“分段错误(核心转储)错误”

String reversal in C++ getting 'Segmentation fault (core dumped) error

下面这个在打印反转字符串后给我 'Segmentation fault (core dumped)' 错误。谁能解释为什么?

#include <iostream>
#include <string>
#include <cstdio>

using namespace std;

void print (char *str) {
    if (*str) {
        print (str+1);
        cout << *str;
    }
}

int main() {
    char *str;
    cin >> str;
    print(str);
    cout << endl;
    return 0;
}

您还没有为 char *str 分配任何内存。尝试使用 char str[20](20 只是一个示例,它可以根据您的需求和您的机器的能力设置),一切都会好起来的。您假设编译器会为您分配内存,但事实并非如此。您正在尝试访问未分配的内存,或者您可以使用 mallocnew.

动态分配它们

除此之外,您还可以使用 std::string 从 stl 获得帮助。

未初始化的非静态局部变量有一个 不确定的 值,实际上看起来是随机的。在没有初始化的情况下使用它们会导致 undefined behavior,这是最常见的崩溃原因之一。

问题是您有一个指针,但它没有指向任何地方,因此当您使用它读取输入时,输入流 cin 将写入内存中的随机位置。

解决方案是不对字符串使用字符指针,而是 std::string class.


如果您使用指针,那么您有两个解决方案:要么将字符串声明为数组,要么使用new 运算符分配内存。但是请注意,如果您输入的内容多于您分配的内容,您将越界并再次出现 未定义的行为

要么像 char str[fixed_size] 那样声明 str,要么使用 std::string。最简单的方法之一可能是:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string str;
    cin >> str;
    reverse(str.begin(),str.end());
    cout <<str<< endl;
    return 0;
}