下面给出了打印反向字符串后的“分段错误(核心转储)”错误。任何人都可以解释原因吗?
#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;
}
答案 0 :(得分:4)
未初始化的非静态局部变量具有 indeterminate 值,实际上看似随机。在没有初始化的情况下使用它们会导致undefined behavior,这是导致崩溃的最常见原因之一。
问题是你有一个指针,但它没有指向任何地方所以当你用它来读取输入时,输入流cin
将写入内存中的随机位置。
解决方案是不使用字符串指针作为字符串,而是使用std::string
类。
如果 使用指针,那么您有两个解决方案:将字符串声明为数组,或使用new
运算符分配内存。但请注意,如果输入的内容超过分配范围,则会写出界限,并再次出现未定义的行为。
答案 1 :(得分:0)
您尚未为char *str
分配任何内存。尝试使用char str[20]
(20只是一个例子,根据您的需求和机器的能力可以是任何东西),一切都会好的。您假设编译器将为您分配内存,但事实并非如此。您正尝试访问未分配的内存,或者可以使用malloc
或new
动态分配内存。
除此之外,你可以使用std::string
从stl。
答案 2 :(得分:0)
声明str
如char 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;
}