0

次のコードがあります。

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 でコンパイルしています。コンパイラから関連する警告が表示されません。

4

4 に答える 4

1

rtdb_pull()そうしないとコンパイラが壊れてしまうため、これが原因 であることは明らかです。

何が起こっているかというと、この関数のプログラミングミスによるrtdb_pull()上書きです。i偶然iで上書きされ0ます。メモリ内の最終的な場所によっては、悪意のある関数が他の変数を上書きしていたり​​、まったく上書きしていなかったりする可能性があります。

あなたの誤ったコードは を上書きしないようです。これjも偶然の一致です。

rtdb_pull()これが発生する場所は、 のコードとrtdb、 、buf、およびncenterが定義され割り当てられているコードを指定した場合にのみ回答できます。

あなたが書いたように動的に割り当てるなど、コードを変更すると、ncenterこの問題が解消される場合があります。しかし、根本的な原因は解決しません。また噛まれることもありますので十分注意してください!

于 2013-08-10T05:32:30.550 に答える
0

はその結果を、およびおそらくにrtdb_pull(rtdb, buf, &ncenter)書き込むように見えるので、それらがどのように割り当てられるかを確認したいと思います。たとえば、 がローカルで、割り当てられたバイト数が少なすぎる場合、関数がバッファをオーバーフローし、スタック上の他の変数 ( . これらの宣言と関連する割り当てを見てみましょう。bufncenterbufi

于 2013-08-10T01:56:09.350 に答える