Você está confundindo o caractere nulo (valor binário 0) com a string vazia .
A "string vazia no começo da linha" é simplesmente o não conteúdo (que existe) antes do primeiro caractere da linha. A string vazia no final da linha, similarmente, é o não-conteúdo similar encontrado após o último caractere da linha. Uma string vazia pode ser considerada como "string vazia, string vazia", enquanto uma string com algum conteúdo pode ser considerada como "string vazia, Hello world, string vazia".
Uma string em C é representada como uma série de bytes não-0 seguidos por um ou mais 0 bytes que indicam terminação de string, mas isso é completamente separado de "string vazia" no parlace de expressão regular e realmente uma escolha interna na linguagem de programação C e na biblioteca padrão. Poucos outros idiomas fazem isso dessa maneira, mas mesmo assim podem representar strings vazias.