2016-11-19 75 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