C:变量突然改变(为什么会发生这种情况?)

时间:2012-08-29 22:28:26

标签: c variable-assignment

当我在线阅读一些在线网站提供的代码时,我遇到了一个我从未预料到的奇怪故障:变量突然改变了它的值而没有任何手动分配。

这是下面的代码:

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。

5 个答案:

答案 0 :(得分:8)

它不会变为-1。它仍然是零。 你的代码中有一个分号(;),你不应该有它。 你应该改为:

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

答案 1 :(得分:2)

rc的值不会改变,而是您的if声明存在问题:

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

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

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

答案 2 :(得分:1)

您有一个小错误

 if (rc == -1);
              ^
              ^

以便始终执行die语句。检查条件的值并且从不使用

答案 3 :(得分:1)

这是错误:

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

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

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

如果您在;之后有if,则会立即看到。

答案 4 :(得分:0)

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

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