If your array is declared with [] then you cannot dynamically allocate it. The [] mean the array will be automatically or statically allocated.
To dynamically allocate some structs that are zeroed, you should do:
struct line *set = calloc(num_lines, sizeof *set);
With dynamic allocation, the array itself does not have a name, however using the pointer set which points to its first element, you can still access all the array members.
I'm not exactly clear on what you are asking about cache, but perhaps it is supposed to be:
struct line **cache = calloc(num_sets, sizeof *cache);
for (size_t i = 0; i < num_sets; ++i)
cache[i] = calloc(num_lines, sizeof *cache[i]);
Please don't use pointer typedefs, they make the code hard to read. You can typedef struct line Line; if you want. And it doesn't really matter whether you do calloc(N, size) or malloc(N * size).
Then you can access those arrays using [] notation, e.g. cache[3][5].tag = 7;
calloc(numSets, sizeof(line))