当我在线阅读一些在线网站提供的代码时,我遇到了一个我从未预料到的奇怪故障:变量突然改变了它的值而没有任何手动分配。
这是下面的代码:
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。
答案 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
由于;
之后的if
,die
超出了if
的范围。如果您不编写结构化代码,这种错误是非常可能和频繁的。这应该是:
if (rc == -1)
{
die("Cannot flush database"); // error handling
}
如果您在;
之后有if
,则会立即看到。
答案 4 :(得分:0)
如前所述,分号是你的问题。
你在这里所做的一切,虽然不是你想要的,但完全合法 - 它被称为空陈述。这是一个分号,没有别的。 if语句,如果为true,实际上是继续执行语句 - 只是一个空语句。