2016-11-19 3 views
0

質問: p2void **と宣言するのはなぜですか?なぜp2*Cでmallocを使ってaligned_mallocを実装する

私たちは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

関連する問題