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 只是一个示例,它可以根据您的需求和您的机器的能力设置),一切都会好起来的。您假设编译器会为您分配内存,但事实并非如此。您正在尝试访问未分配的内存,或者您可以使用 malloc
或 new
.
动态分配它们
除此之外,您还可以使用 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;
}
下面这个在打印反转字符串后给我 '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 只是一个示例,它可以根据您的需求和您的机器的能力设置),一切都会好起来的。您假设编译器会为您分配内存,但事实并非如此。您正在尝试访问未分配的内存,或者您可以使用 malloc
或 new
.
除此之外,您还可以使用 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;
}