c - 这个 c 函数如何减少我的计数器?

标签 c gcc compiler-construction call

我有以下代码:

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。巧合的是,i0 覆盖。根据事物最终在内存中的位置,您的恶意函数可能会覆盖其他变量,或者根本不覆盖其他变量。

看来您的错误代码不会覆盖 j,这只是另一个巧合。

如果发生这种情况,只有在提供 rtdb_pull() 代码以及 rtdbbufncenter 已定义并分配。

更改代码,例如按照您编写的动态分配ncenter,可能会使此问题消失。但这并不能解决根本原因。所以要非常小心,它可能会再次咬人!

关于c - 这个 c 函数如何减少我的计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156572/

相关文章:

c - MD4 RFC1320 给出错误的哈希值

c - 如何打印彩色空格并在A之后关闭颜色代码?

c - 对 `main' 的 undefined reference collect2 : error: ld returned 1 exit status

Objective-C 属性赋值返回赋值?

在 C 中调用外部函数

c - C 中的错误处理? scanf和非法字符如何处理?

c++ - 如何让 lambda 函数在 gcc 5+ 上不起作用

c++ - 对虚重载函数感到困惑

gcc - 什么是隔离错误路径优化

compiler-construction - 从硬件编写低级语言