It's not just their size, but wouldn't all arrays need know the address of their first element too? For example, consider a simple char buffer:
char buf[512];
where we want to read x number of bytes from a file descriptor starting from a offset other than the first element:
read(fd, buf + 256, sizeof(buf)); // Whoops, incorrect sizeof, buffer overflow!
Could the compiler still detect this buffer overflow error without knowing the address of the first element in the array?
What about:
char *dst = buf + 256;
...
read(fd, dst, sizeof(buf));
perhaps the compiler could trace back all the calculations performed on the dst pointer to see whether this operation is valid?