2012-12-02 47 views
0

我有一個結構,其中包含兩個指向函數和一些數據的指針。這些函數的定義方式是相同的,但是它們應該執行不同的任務(這就是爲什麼它們在原始源中具有不同的名稱)。如果我使用第一個函數,一切都很順利,但是如果使用第二個函數,我會得到一個段錯誤 - 即使我將同一個指針傳遞給兩個函數。使用結構函數導致段錯誤

指針既不是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:沒有必要對此進行測試,因爲這莫名其妙的作品,但我的原始出處 - 這基本上是一樣的 - 不?

+0

我建議你在這個版本和失敗之間的「復活節彩蛋」。 –

+1

編譯調試信息和所有警告,並學習使用調試器。在Linux上,使用'gcc -Wall -g'編譯並使用'gdb'進行調試。 –

+3

'test = malloc(sizeof(test))'是錯誤的;應該是'test = malloc(sizeof * test)'。 – melpomene

回答

2

不應該行structPt test = malloc(sizeof(test));structPt test = malloc(sizeof(structImpl));

+1

malloc(sizeof(structImpl))拋出一個錯誤,它應該是:malloc(sizeof(struct structImpl));或者malloc(sizeof * test);但是,謝謝! – Aernomn