gpt4 book ai didi

c++ - 在 C++ 中打印 char 字符串时,Linux Ubuntu 中的 g++ 出现段错误,但 Windows 中的 g++/MingW 则不会出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:01 27 4
gpt4 key购买 nike

我有一个程序,其中:

  1. 创建一个包含 3 char 的数组指针,char *z_str[3]; .
  2. 分配 char 类型的动态内存对象并将返回的指针分配给这些 char指点。
  3. 提示用户提供输入字符串。
  4. 打印提供的字符串。
<小时/>

源代码:

#include <iostream>
using namespace std;

int main()
{
char *z_str[3];
int i;

for(i = 0; i < 2; i++)
{
z_str[i] = new char [30];
if(z_str[i] == NULL)
{
cout << "Memory for String " << i+1 << " could not be allocated!" << endl;
cout << "Program terminates.";
return 1;
}
}

cout << endl << endl;

cout << "Please input the first string [max.29 characters]:" << endl;
cin >> z_str[0];
cout << endl;

cout << "Please input the second string [max.29 characters]:" << endl;
cin >> z_str[1];
cout << endl;

cout << "Please input the third string [max.29 characters]:" << endl;
cin >> z_str[2];
cout << endl << endl;


cout << "First string is:" << endl;
cout << z_str[0] << endl << endl;

cout << "Second string is" << endl;
cout << z_str[1] << endl << endl;

cout << "Third string is:" << endl;
cout << z_str[2] << endl << endl;

return 0;
}

当我在 Linux Ubuntu 中使用 g++ 编译此代码并运行该代码时,当程序打印 char 时,我遇到段错误。将字符串输入 CLI。

终端输出:

Please input the first string:
string1

Please input the second string:
string2

Please input the third string:
string3
Segmentation fault (core dumped)
<小时/>

现在,如果我在 Windows 10 中使用 g++/MingW 编译相同的代码,一切都会像在 PowerShell 中一样工作:


Please input the first string:
string1

Please input the second string:
string2

Please input the third string:
string3


First string is:
string1

Second string is
string2

Third string is:
string3
<小时/>
  • 为什么在 C++ 中打印字符字符串时,在 Linux Ubuntu 中使用 g++ 会出现段错误,而在 Windows 中使用 g++/MingW 则不会出现段错误?

最佳答案

循环

for(i = 0; i < 2; i++)

会让您初始化z_str[0]z_str[1],但不会z_str[2]

因此,当您在 z_str[2] 中使用未初始化和不确定的值时,您会遇到未定义的行为(以及崩溃)。

您需要增加循环来迭代所有元素:

for(i = 0; i < 3; i++)
<小时/>

对于所有这些问题都有更好的解决方案,我推荐的解决方案是使用 std::arraystd::string对象:

std::array<std::string, 3> z_str;

现在您不需要自己进行任何动态分配,数组中的所有三个字符串都将默认构造,这意味着它们将是空(但有效)字符串。

如果您不允许使用 std::arraystd::string,还有其他方法可以改进您的程序,例如使用 range for loops :

for (auto& str_ptr : z_str)
str_ptr = new char[30];

上面的循环保证迭代数组的所有元素。

关于c++ - 在 C++ 中打印 char 字符串时,Linux Ubuntu 中的 g++ 出现段错误,但 Windows 中的 g++/MingW 则不会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59933147/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com