2016-11-19 77 views
0

中實現aligned_malloc問題: 爲什麼我們聲明p2void **?爲什麼不是p2*使用malloc在C

我們正在返回p2,但我們的返回函數類型是void *。這沒有任何意義。編譯器會說不匹配的返回類型。

void *aligned_malloc(size_t required_bytes, size_t alignment) { 
    void *p1; 
    void **p2; 
    int offset=alignment-1+sizeof(void*); 
    p1 = malloc(required_bytes + offset);    // the line you are missing 
    p2=(void**)(((size_t)(p1)+offset)&~(alignment-1)); //line 5 
    p2[-1]=p1; //line 6 
    return p2; 
} 
+5

http://stackoverflow.com/questions/12504776/aligned-malloc-in-c –

+0

我認爲瑪麗亞從上面得到的功能鏈接。但她卻問了一個不同的問題。 –

回答

0

void**可以隱式轉換到void*,所以不應該有一種類型的問題。

它被宣佈爲void**的原因是爲了方便將分配的指針存儲在它的前面。

它的工作原理是這樣的代碼,它使用另一個變量:

void *aligned_malloc(size_t required_bytes, size_t alignment) { 
    void *p1; 
    void *p2; 
    void **p3; 
    int offset=alignment-1+sizeof(void*); 
    p1 = malloc(required_bytes + offset); 
    p2= (void*)(((size_t)(p1)+offset)&~(alignment-1)); 
    p3 = (void**) p2; 
    p3[-1]=p1; 
    return p2; 
} 
+0

所以基本上,'void **'是使它成爲數組。而使它成爲數組的原因是因爲我們需要存儲分配的指針? – Maria