2012-08-01 51 views
4

我想在mac上編譯一個工具包。它有一個對malloc.h的memalign函數的引用,但是我能找到的唯一關閉函數是posix_memalign。所以我想把posix_memalign換成memalign。如何包裝posix_memalign(在mac上編譯舊的代碼庫)?

我有點困惑如何做到這一點(因爲無效*和無效**指針):

爲posix_memalign簽名是

int posix_memalign(void **memptr, size_t alignment, size_t size); 

和memalign可簽名是:

void *memalign(size_t blocksize, size_t bytes); 

任何指針非常讚賞。 (雙關語跛意外:)

感謝

回答

5

喜歡的東西:

void *memalign(size_t blocksize, size_t bytes) { 
    void *result=0; 
    posix_memalign(&result, blocksize, bytes); 
    return result; 
} 

&result將讓你void**打電話posix_memalign用,然後根據memalign可沒有你可以返回結果。

有一點要注意:這不完全匹配的行爲 - 包括memalign通過errno返回錯誤,但他們posix_memalign返回爲int和不接觸errno。你應該看到它仍然以某種方式適當地處理錯誤。

+0

此包裝製成的功能正確編譯。但是運行該工具包時,我會遇到段錯誤。我不確定它是因爲這個包裝還是其他。我正在調查。如果您好奇,我正嘗試在osx lion上編譯[SVDFeature toolkit](http://svdfeature.apexlab.org/wiki/images/8/85/Svdfeature-1.2.tar.gz)。 – user1521607 2012-08-01 18:53:29

+1

@ user1521607 posix_memalign要求對齊是2的冪和sizeof(void *)的倍數,但memalign只需要它是2的冪。我懷疑傳入的對齊是2的冪,但小於sizeof(void *)。如果是這種情況,請嘗試將sizeof(void *)加起來。你也可以用posix_memalign的結果分配errno。 – 2012-08-01 22:06:40

0

所以處理錯誤正確:

void *memalign(size_t blocksize, size_t bytes) 
{ 
    void *m; 
    errno = posix_memalign(&m, blocksize, bytes); 
    return errno ? NULL : m; 
}