malloc reuses memory without zeroing it, so it may not be all zeroes. calloc simply zeroes the bytes after allocating them. Basically it's just malloc followed by a memset, although it also has a different signature for some reason.
Code:
void* my_calloc(size_t num, size_t size)
{
    void *p = malloc(num * size);
    return p ? memset(p, 0, num * size) : NULL;
}
As long as all-bytes-zero means zero for your variable type (or NULL for your pointer type) then you can say that they are set to zero (or NULL).