いつもお世話になっております。
いま、書いているプログラムで関数ポインタを使用しているのですが、
オーバーフローをしているみたいなのです。
関数ポインタを使用するときに、気をつけないといけないことってありますか?
ちなみに、下記の場合ですと、test[10]の値が書き変わってしまうのです。
typedef struct tagA{
int (*func)(int *, void *);
int test[10];
}A;
関数ポインタの宣言も関数に合わせて(引数の型など)書いてます。
なにか、ありましたらおしえていただけませんでしょうか?
>typedef struct tagA{
> int (*func)(int *, void *);
> int test[10];
>}A;
これだけでは
>test[10]の値が書き変わってしまうのです
ということはあなた以外の誰にもあなたの仰(おっしゃ)る事がおこるかどうかも判りません
少なくとも、どのような場合にそうなるのか位は書かないと何が何だか分りません
オーバーフローしているらしいと判断した理由は何ですか?
何が起きたのでそう思うのでしょうか?
判断ではなく、事実を教えて下さい
>オーバーフローしているらしいと判断した理由は何ですか?
test[10] の 値が自分が設定した値とは違うものだったのです。
そこで 下記のように AAAA[10] を追加したら、 test[10]に入る値
は自分が設定した値になりましたので、オーバーフローしたのではないかと
考えています。
AAAA[10] の値も見覚えが無い値でしたし・・・
typedef struct tagA{
int (*func)(int *, void *);
int AAAA[10];
int test[10];
}A;
・func, AAAA, testにどういう値をどのようにして設定したのか
・「見覚えのない値」がどのようになっていたのか
を教えてください。
あと、「funcに与えたポインタが指している関数の宣言部分」も。
これだけの情報では、誰に質問しても解らないと思います。
デバックで1ステップづつ追っかけていけば自分で解ると思いますが。
該当するデータをウォッチしてステップ実行してみてください。
オーバーフローという言葉は普通はそういう場合には使いません。
もっとも、バッファーオーバーフローという言葉も有りますが、この場合に当てはまるかどうか
あまり自信がありません。
つまり、予期しない領域に書き込みが起こって、データーが壊れたという事ですね?
では、どのようにした場合に構造体 A の test[10] に異常なデーターの書き込みが
起きるのですか?
サンプル全部試しましたが異常なしであります!
初期化とかチェックしてましょう。たとえば、ZeroMemory(test, sizeof(char)*10)
とかしてないかな?sizeof(long)ならいってることおきそうかな。
test[10] は存在しないのでそこに入っている値には何の意味も無いという罠かも。
test[0]...test[9] しか無い、ということは正しく理解していますか>元発言者