我有一個結構,其中包含兩個指向函數和一些數據的指針。這些函數的定義方式是相同的,但是它們應該執行不同的任務(這就是爲什麼它們在原始源中具有不同的名稱)。如果我使用第一個函數,一切都很順利,但是如果使用第二個函數,我會得到一個段錯誤 - 即使我將同一個指針傳遞給兩個函數。使用結構函數導致段錯誤
指針既不是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:沒有必要對此進行測試,因爲這莫名其妙的作品,但我的原始出處 - 這基本上是一樣的 - 不?
我建議你在這個版本和失敗之間的「復活節彩蛋」。 –
編譯調試信息和所有警告,並學習使用調試器。在Linux上,使用'gcc -Wall -g'編譯並使用'gdb'進行調試。 –
'test = malloc(sizeof(test))'是錯誤的;應該是'test = malloc(sizeof * test)'。 – melpomene