関数といくつかのデータへの2つのポインターを持つ構造体があります。関数は定義的には同じですが、異なるタスクを実行する必要があります(これが、元のソースで異なる名前を持っている理由です)。最初の関数を使用するとすべてうまくいきますが、2番目の関数を使用すると、両方の関数に同じポインターを渡しても、セグメンテーション違反が発生します。
ポインタはNULLでもガベージでもないか、両方とも失敗しますが、どういうわけか後者だけがセグフォールトされます。何故ですか?
私は次のコードを持っています:
typedef void (*funcOneDef)(void*);
typedef void (*funcTwoDef)(void*);
typedef struct structImpl* structPt;
struct structImpl {
void *data;
funcOneDef funcOne;
funcTwoDef funcTwo;
};
structPt create(void *data, funcOneDef funcOne, funcTwoDef funcTwo)
{
structPt test = malloc(sizeof(test));
test->data = data;
test->funcOne = funcOne;
test->funcTwo = funcTwo;
return test;
}
void execFuncOne(structPt test)
{
test->funcOne(test->data); //works!
}
void execFuncTwo(structPt test)
{
test->funcTwo(test->data); //segfault!
}
PS:どういうわけかこれは機能するので、これをテストする必要はありませんが、私の元のソース(基本的に同じです)は機能しませんか?