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

时间:2015-03-16 17:58:24

标签: c++ string recursion

下面给出了打印反向字符串后的“分段错误(核心转储)”错误。任何人都可以解释原因吗?

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

3 个答案:

答案 0 :(得分:4)

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

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

解决方案是不使用字符串指针作为字符串,而是使用std::string类。


如果 使用指针,那么您有两个解决方案:将字符串声明为数组,或使用new运算符分配内存。但请注意,如果输入的内容超过分配范围,则会写出界限,并再次出现未定义的行为

答案 1 :(得分:0)

您尚未为char *str分配任何内存。尝试使用char str[20](20只是一个例子,根据您的需求和机器的能力可以是任何东西),一切都会好的。您假设编译器将为您分配内存,但事实并非如此。您正尝试访问未分配的内存,或者可以使用mallocnew动态分配内存。

除此之外,你可以使用std::string从stl。

获得帮助

答案 2 :(得分:0)

声明strchar str[fixed_size]或使用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;
}