【问题标题】:Segmentation Fault when getting user input获取用户输入时出现分段错误
【发布时间】:2011-11-28 13:35:41
【问题描述】:

我有这个:

    // Get database access parameters 
    const char* db = "codes", *server = "localhost", *user = "root", *pass = "pass";

    // Connect to the sample database.
    mysqlpp::Connection conn(false);
    if (conn.connect(db, server, user, pass)) {

        for (int i=0; i<10; ++i)
        {
            int d, count;
            cout << "Введите D\n";
            cin >> d;
            cout << "Введите количество записей при D=" << d << endl;
            cin >> count;
            for (int a=0; a<count; ++a)
            {
                char * name;
                int r,n1,n2;
                cout << "Введите R\n";
                cin >> r;
                cout <<"Введите n1 и n2\n";
                cin >> n1 >> n2;
                cout <<"Введите название\n";
                cin >> name;
                mysqlpp::Query query = conn.query();
                for (int j=n2-n1+1; j<n2; ++j)
                {
                    int k =pow(2,(j+r));
                    query << "insert into code (n,k,d, name) values (" << j << "," << k << "," <<d<<"," << mysqlpp::quote_only << name << ");";
                    query.execute(); 
                }
            }
        }
        conn.disconnect ();
        return 0;
    }
    else {
        cerr << "DB connection failed: " << conn.error() << endl;
        return 1;
    }
}

抱歉发布所有代码。 我可以毫无错误地编译程序,但在命令行中,它显示“分段错误”。这是什么错误?又该如何解决呢?

【问题讨论】:

  • 你应该让你的下一个任务学习使用调试器,例如 gdb。调试器会告诉您,您在 cin &gt;&gt; name; 行中崩溃了,并且 name 不是一个理智的指针。
  • 如果你在linux上,试试valgrind

标签: c++ segmentation-fault


【解决方案1】:

你应该为

分配空间
char * name;

在写之前。

如果您知道 name 不会比 MAXNAME 长,那么只需将 name 定义为

char name[MAXNAME+1]

这应该可以解决您的问题。

【讨论】:

  • 谢谢。还有一件事,我不能进入语法高亮,这是怎么回事?
  • @АйкСаркисян 你自己搞定的!:) 如果你觉得答案令人满意,请考虑接受。
  • 如果你真的推荐 C++ 中的 char 数组,请展示如何避免缓冲区溢出。 char name[MAXNAME+1]解决问题,它只是隐藏它们,直到不再有名称的假设不再成立。
【解决方案2】:

我看到您正在使用 C++。在这种情况下,您应该使用

std::string name;

因此您不必为其分配空间。

经验法则:如果您使用 C++,请使用 &lt;string&gt; 而不是 char[];使用&lt;vector&gt; 而不是数组;使用由构造函数初始化的成员变量,而不是 either malloc() new()。相信我,它会让你的编码生活更轻松。

(每个规则都有例外,但这是起点......)

【讨论】:

  • 是的,我已经改成字符串了,char好像是硬核的。
  • @АйкСаркисян 请记住,字符串好东西不是免费的,而是会带来性能损失。如果你可以忽略它,当然使用字符串。
  • @RomanB.:一个已经伤害了许多 C++ 项目的都市传说,因为人们相信它并编写了半生不熟、充满错误的 C 风格代码。如果您害怕调整大小,请添加name.reserve(MAXNAME+1);。当 Knuth 谈到过早优化时,他的意思就是这种情况。 证明在编写char[] 之前,C++ 字符串是性能瓶颈。其他一切都只是粗制滥造的做工。我见过许多因 char 缓冲区溢出而受到伤害的项目,但没有一个因正确使用 std::string 而受到伤害。
  • @DevSolar 这是证明:d-programming-language.org/cppstrings.html 请参阅底部的表格。
  • @RomanB.:是否适用于 OP 的问题......如何?他既不在 D 中编码,name 的类型对他的程序的性能也不是至关重要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2015-08-19
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多