【问题标题】:int issue in g++/mysql/redhatg++/mysql/redhat 中的 int 问题
【发布时间】:2009-04-02 16:43:32
【问题描述】:

我已经有一段时间没有写过 C 语言了,我正在使用 MySQL C API 编写一个应用程序,在 redhat 上用 g++ 编译。

所以我开始使用 printfs 输出一些字段...使用 oracle api 和 PRO*C,我曾经使用过(几年前在 suse 上),我可以选择一个 int 并将其输出为:

int some_int; printf("%i",some_int);

我尝试使用 mysql ints 执行此操作,但显示了 8 个随机数...我认为这是 mysql api 问题和我的服务器的一些配置问题,我浪费了几个小时试图修复它,但无法't,发现我可以做到:

int some_int; printf("%s",some_int);

它会正确打印出整数。因为我没有对我提取的值进行计算,所以我认为这是一个不错的解决方案。

直到我试图计算一些东西....

我做了一个简单的:

整数行数; 对于([stmt]){ 行数++; } printf("%i",rowcount);

我又得到了一个 8 位随机数……我不知道这台机器上的整数是怎么回事。

然后我意识到,如果我将 int 初始化为零,那么我会得到一个正确的数字。

有人可以向我解释一下在什么条件下需要将 int 变量初始化为零?我不记得每次在我的旧代码库中都这样做,而且我没有在示例中看到它,我正在建模我的 mysql_stmt 代码...

我有什么遗漏吗?另外,我完全有可能忘记了每次都是必需的

谢谢...

【问题讨论】:

  • 在这种情况下您没有显示所有代码,请附上您用于从数据库中选择一个 int 的代码,因为现在您只是在打印垃圾数据。

标签: mysql c api initialization


【解决方案1】:

如果您不初始化变量,则无法保证默认值为 0/NULL/任何值。一些编译器可能会为您将其初始化为 0(IIRC、MSVC++ 6.0 会很好地这样做),而其他编译器可能不会。所以不要依赖它。永远不要在没有先给它某种合理值的情况下使用变量。

【讨论】:

    【解决方案2】:

    只有全局和静态值会被初始化为零。堆栈上的变量如果没有初始化,总是会包含垃圾值。

    int g_var; //This is a global varibale. So, initialized to zero
    int main()
    {
    
    int s_var = 0; //This is on stack. So, you need to explicitly initialize
    static int stat_var;  //This is a static variable,  So, initialized to zero
    }
    

    【讨论】:

    • 完美!这就是我一直在寻找的差异......非常感谢。
    • 澄清一下,我将所有全局变量用于程序顶部的绑定变量,这导致我对这个问题感到迷茫......谢谢
    • Windows 上的全局变量是否初始化为零?我模糊地记得这只是 UNIX 行为,但我可能错了。
    【解决方案3】:

    你总是需要初始化你的变量。要捕获此类错误,您可能应该使用-Wall 进行编译,以提供g++ 可以提供的所有警告。我也更喜欢使用-Werror 来生成所有警告错误,因为警告几乎总是指示错误或潜在错误,并且清理代码比保持原样更好。

    另外,在您的第二个 printf 中,您使用了 %s,它用于打印字符串,而不是整数。

    int i = 0;
    printf("%d\n", i);
    // or
    printf("%i\n", i);
    

    是你想要的。

    【讨论】:

      【解决方案4】:

      变量不会在 c 中自动初始化。

      【讨论】:

        【解决方案5】:

        你确实忘记了。在 C 和 C++ 中,您不会得到任何自动初始化; int c; 之后的c 的内容就是当时c 所指的地址中的任何内容。

        最佳实践:在定义处初始化:int c = 0;

        哦,PS,注意 MySQL 的 int 类型与 C 的 int 类型匹配;我认为确实如此,但我并不积极。但是,它对架构和编译器都敏感,因为 sizeof(int) 在所有 C 环境中都不相同。

        【讨论】:

          【解决方案6】:

          未初始化的变量。

          int some_int = 0;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-28
            • 1970-01-01
            • 2022-01-13
            • 1970-01-01
            • 2011-09-07
            • 2023-03-21
            • 2012-07-03
            • 2011-05-28
            相关资源
            最近更新 更多