title: Aligned malloc in C++
body: <p>I have a question on problem 13.9 in the book, "cracking the coding interview".
  The question is to write an aligned alloc and free function that supports allocating memory, and in the answer the code is given below:</p>
  
  <pre><code>void *aligned_malloc(size_t required_bytes, size_t alignment) {
    void *p1;
    void **p2;
    int offset=alignment-1+sizeof（void*);
    if((p1=(void*)malloc(required_bytes+offset))==NULL)
    return NULL;
    p2=(void**)(((size_t)(p1)+offset)&amp;~(alignment-1));  //line 5
    p2[-1]=p1; //line 6
    return p2;
  }
  </code></pre>
  
  <p>I am so confused with the line 5 and line 6. Why do you have to do an "and" since you have already add offset to p1? and what does [-1] mean? Thanks for the help in advance.</p>