0

関数といくつかのデータへの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:どういうわけかこれは機能するので、これをテストする必要はありませんが、私の元のソース(基本的に同じです)は機能しませんか?

4

1 に答える 1

2

線はすべきではありませんstructPt test = malloc(sizeof(test));structPt test = malloc(sizeof(structImpl));

于 2012-12-02T13:37:03.113 に答える