0

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

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

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

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

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

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

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

我做了一个简单的:

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

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

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

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

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

谢谢...

4

6 回答 6

1

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

于 2009-04-02T16:45:45.300 回答
1

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

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
}
于 2009-04-02T16:48:32.577 回答
1

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

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

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

是你想要的。

于 2009-04-02T16:56:24.447 回答
0

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

于 2009-04-02T16:46:26.250 回答
0

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

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

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

于 2009-04-02T16:46:59.383 回答
0

未初始化的变量。

int some_int = 0;
于 2009-04-02T16:50:37.800 回答