C++ cin , Segment fault 11

C++ cin , Segment fault 11

本文关键字:fault Segment cin C++      更新时间:2023-10-16

当我输入字符串时,这给了我seg故障11。为什么我有隔离故障?这很简单……隔离断层从何而来?

int main(){
    char * str;
    printf ("please enter string : ");
    cin >> str;
    // reverse_str(str);   
}

您没有为str分配任何内存。所以你实际上是在尝试写一个不能保存字符串的指针。本质上,这将导致未定义行为和隔离错误。

解决方案是:
你应该使用std::string而不是指针。

std::string str;
std::cout<<"please enter string :  ";
std::cin >>str;

还有,尽量不要把C和c++混在一起。
在c++中使用streams而不是printf


或者,还有其他两种方法:

不太好其他方法1:
您可以通过将str设置为固定大小的数组来分配内存:

#define MAX_INPUT 256
char str[MAX_INPUT]={0};

的缺点:
这将要求您需要知道用户在编译时可以输入的最大输入长度,因为c++中不允许可变长度数组

不太好其他方法2:
您可以使用new []动态地为str分配内存。在本例中,str将是一个指针。

#define MAX_INPUT 256
char *str = new char[MAX_INPUT];

的缺点:
这种方法也有缺点,在这种情况下,由于用户输入的是字符串,因此无法知道在编译时应该分配多少内存。此外,您需要记住通过调用delete[]来释放内存,否则会泄漏内存。另外,尽量避免在c++中使用new

结论:
这里的最佳解决方案是使用std::string,因为它可以使您避免上述所有问题。

str没有指向任何合理的东西。你需要有内存来写。

std::string str;
std::cout << "please enter string: ";
std::cin >> str;

您应该使用std::string

你的宣言:

char * str;

仅声明一个指针,但不为要存储的字符串分配内存区域。解决方案可以是

char str[256];

char * str = new char[256];

然而,它们是非常糟糕的风格,因为每次你想要写入它时,你都必须检查和控制输入的大小。

c++提供std::string来存储字符串。使用它。

您的第一行char * str声明了一个原始指针,并且没有初始化它或分配任何内存。这意味着它可以指向任何地方,而且很可能不是有效或有用的地方。当您尝试在第三行使用它时,最有可能出现段错误。你能用std::string代替吗?

使用std::string

或者,如果你只想使用char *(不鼓励):

char * str = new char[256];
cin >> str;

您需要首先为str分配内存。你只声明了一个指针

char* str = (char*)malloc(MAX_SIZE_OF_BUFFER);

当程序访问不属于它的内存时,就会发生分段错误。指针str没有初始化。它不指向任何记忆。流提取操作符>>不会为它读取的字符串分配新的内存;它期望指针已经指向一个它可以填充的缓冲区。但是,它不知道str是垃圾。它假定它是一个有效的指针,并尝试写入该内存。由于该垃圾地址处的内存不属于您的程序,因此操作系统会以分段错误将其停止。

改为读入std::string。更好的是,使用std::getline,这样用户可以输入带空格的字符串;>>运算符将只读取到第一个空白字符。

std::string str;
std::getline(cin, str);