Se reservan en diferentes posiciones, tu problema es que vos estas viendo la dirección del puntero y no la dirección a la que apunta. La dirección del puntero va a ser siempre la misma porque en el ejemplo que pusiste es una variable local que se encuentra en la pila.
for(i=0;i<2;i++){
char * buffer
= (char*)malloc(20); }
Ten en cuenta que haciendo esto pierdes todas las referencias anteriores a la ultima por lo tanto pierdes la posibilidad de liberar esa memoria. En todo caso podrías usar un arreglo de punteros.
Saludos