-9

私は機能を持っています:

int somefunction(int a, int b, char *c, int d){}

現在、この関数は にある別の関数で呼び出されていmain()ます。

私は呼び出しsomefunction(a, b, c, d);て、それを印刷してもらいます.魔女は呼び出されるint a前に50として宣言されています. somefunction()最初の呼び出しでは 50 が出力され、すべて適切でダンディですが、 の 2 番目の呼び出しではsomefunction()29549 が出力されます。これらの関数呼び出しはいくつかの if ステートメント内にあり、2 番目の場所がsomefunction()呼び出されたとしても、最初に呼び出されます。

テストでは、すべての入力値が同じに設定されているため、入力ではありません。すべての入力値は、 を呼び出す前に出力さsomefunction()れ、本来あるべき状態になっています。すべての変数、関数の名前を変更しようとしました。すべての int を float に変更しようとしましたsomefunction()。しかし、注意が変わりました。試作品も作ったことがありますが、そうではありません。

それで、誰がこれをどのように進めることができるかについて何か考えを持っていますか? 2000 行を超えたので、実際のコードはここにはありません。その間に無関係なコードがたくさんあります。私を助けるのは難しいかもしれないとわかっているので、誰かが同じようなことを経験したかどうかだけ尋ねています.

4

2 に答える 2

0

ロジックをテストするためのサンプル コードを作成しました。以下に、正常に機能する小さなコードを見つけてください。

#include <stdio.h>

void someFunc(int a, int b)
{
    printf("Inside interface function: a: %d\t b: %d\n", a, b);
}

int main(int argc, char** argv)
{
      int a = 35, b = 45;
      printf("a = %d, b = %d\n", a, b);
     someFunc(a, b);
     a = 50; b = 75;
     printf("a = %d, b = %d\n", a, b);
     someFunc(a, b);

     return 0;
}
于 2013-02-10T15:58:03.603 に答える
0

したがって、ポインターと安全でない配列を含む言語を使用していて、おかしなことが起こり始めたら、メモリを上書きしているのではないかとすぐに疑う必要があります。これを行うには多くの方法があります: 配列の末尾を超えて書き込む、初期化されていないポインターを使用する、malloc() されたことのない何かを free() するなど。

それがあなたのケースで起こっていることである場合、正確完全なコードを見ずに解決することは非常に困難です(単純化された例を作成しようとすると、エラーのあるコードを削除するか、メモリを再配置して別のコードを使用できるようになるため、問題が解決することがよくありますおそらく無害なものが上書きされています)。

バグを示す完全な例を投稿できない場合は、可能性のある原因を調べることができます: a) 動的メモリ関数のすべての使用、b) ポインターのすべての逆参照。

あなたの他の投稿から収集できたのは、a)うん、それはワイルドポインターに適した種類のコードであり、b)うーん、これは何ですか:

char char_buffer[] = "What ever";

コードの断片から推測するのは難しいですが、通常、「バッファ」という言葉は、複数回再利用される大きなスペースを意味します。文字ポインターに「char_buffer」という名前を付けましたが、実際には文字列定数を指しています。したがって、たとえば、後で 11 文字分のデータをコピーしようとすると、何か他のものを上書きすることになります (コンパイラ/リンカーが定数を読み取り専用メモリに格納しなかったと仮定します)。

于 2013-02-10T16:26:32.027 に答える