1

当我在玩一些在线站点提供的代码时,我遇到了一个我从未预料到的奇怪故障:一个变量在没有任何手动赋值的情况下突然改变了它的值。

这是下面的代码:

int rc = fwrite(conn->db, sizeof(struct Database), 1, conn->file);
printf("rc is equal to %d\n", rc); // should print out 1
if (rc != 1) die("Failed to write Database.");

rc = fflush(conn->file);
printf("rc is equal to %d\n", rc); // should print out 0
if (rc == -1); die("Cannot flush database"); // error handling
// error comes up because rc suddenly changes to -1

我不明白它是如何发生的,但想知道为什么一个变量在 C 中不应该发生变化时突然发生变化。

代码来源: http ://c.learncodethehardway.org/book/learn-c-the-hard-waych18.html (Database_write下的堆栈和内存)

顺便说一句,我在 Mac osx 10.6 雪豹上的终端中使用 vim。

4

5 回答 5

8

它不会更改为 -1。它仍然为零。您的代码中有一个分号 (;),您不应该在其中使用它。您应该改为:

if (rc == -1) die("Cannot flush database");
于 2012-08-29T22:31:00.683 回答
2

的值rc没有改变,而是您的if陈述有问题:

if (rc == -1); die("Cannot flush database");
             ^

第二if条语句没有与之关联的操作。除非;被删除,否则die()无论 的值如何,都将始终执行rc。即,改用这个:

if (rc == -1) die("Cannot flush database");
             ^
于 2012-08-29T22:31:28.023 回答
1

你有一个小错误

 if (rc == -1);
              ^
              ^

这样 die 语句总是被执行。条件的值被检查并且从未使用过

于 2012-08-29T22:32:42.523 回答
1

这是错误:

if (rc == -1); die("Cannot flush database"); // error handling

因为你;之后的ifdie是超出了你的范围的if。如果您不编写结构化代码,这种错误是非常可能和频繁的。这应该是:

if (rc == -1)
{
    die("Cannot flush database"); // error handling
}

如果你有一个;之后if,你会立即看到。

于 2012-08-29T22:47:24.307 回答
0

如前所述,分号是您的问题。

你在这里所做的,虽然不是你想要的,是完全合法的——它被称为空语句。这被写成一个分号,没有别的。if 语句,如果为真,实际上是在继续执行一个语句——只是一个空语句。

于 2012-08-29T23:01:27.087 回答