我有以下代码:
int i;
for(i=0;i<2;i++) {
...
printf("i = %d\n",i);
rtdb_pull(rtdb, buf, &ncenter);
printf("i = %d\n",i);
...
}
当我运行它时,当 i=0 时它运行得很好,但是一旦 i=1,rtdb_pull 函数似乎就会减少计数器,所以我最终陷入了循环。这怎么可能?我没有将 i 传递给 rtdb_pull,rtdb_pull 也没有使用名为 i 的变量。
如果我这样做,一切都会正常:
int i;
for(i=0;i<2;i++) {
...
printf("i = %d\n",i);
int j = i;
rtdb_pull(rtdb, buf, &ncenter);
i = j;
printf("i = %d\n",i);
...
}
郑重声明,我在 Ubuntu 13.04 上使用 gcc 4.7.3 并使用 ANSI c 进行编译。我没有从编译器收到任何相关警告。
最佳答案
很明显,rtdb_pull()
导致了这种情况,否则编译器将被破坏。
发生的情况是,由于该函数中的编程错误,rtdb_pull()
正在覆盖 i
。巧合的是,i
被 0
覆盖。根据事物最终在内存中的位置,您的恶意函数可能会覆盖其他变量,或者根本不覆盖其他变量。
看来您的错误代码不会覆盖 j
,这只是另一个巧合。
如果发生这种情况,只有在提供 rtdb_pull()
代码以及 rtdb
、buf
和ncenter
已定义并分配。
更改代码,例如按照您编写的动态分配ncenter
,可能会使此问题消失。但这并不能解决根本原因。所以要非常小心,它可能会再次咬人!
关于c - 这个 c 函数如何减少我的计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156572/