Both malloc() and calloc() allocate a contiguous block of memory. The only difference is that calloc() sets the memory allocated to zero. So, if malloc(no_of_elements*size_of_element) would fail, so would calloc(no_of_elements, size_of_element).
You should NEVER assign the address of a "hole" (your word, not mine) to any pointer: that would give you a dangling pointer (a pointer to memory that may no longer be available for use by the program). Any attempt to access such memory (read its value or write to it) gives undefined behaviour.
However, if the pointer is valid (i.e. not dangling) pointer or array syntax can be used. For example;
Code:
char *p = some_valid_block_of_ten_chars();
p [0] = 'A'; /* valid */
p[9] = 'Z'; /* valid */
p[10] = 'Q'; /* invalid: cannot access 11th char if the buffer is only 10 char */