O resultado de cada operação intermediária deveria ser empilhado e não acumulado na variável 'resultado',
Bingo!
Esse não tem jeito... é meio grave. É conceitual ... 
Além disso, acho que já que " tabela[0] é o valor da variável A, ... ", o acesso aos valores das variáveis empilhadas deveria ser via algo como "tabela['A' - pilha[--topo]]", certo?
Bingo novamente.
Esse não e um problema grave, precisava apenas entender como a tabela ASCII codifica caracteres. 
Por fim, as comparações nos if-elses estão usando operador de atribuição(=) em vez do operador de comparação (==)... o que dá calafrios... rs..
Esse e tipo erro besta de digitação e cut-and-paste
As opções de compilação "padrão" fornecem um aviso e se realmente desejamos escrever uma atribuição deveríamos escrever:
if ( (posf[i] = '+') ) ...
Isso deixaria o compilador feliz. Bem, no caso era erro mesmo.
A seguir esta uma versão corrigida.
/* eval() supoe que a expressao posfixa esta correta
e nao ocorrera divisao por zero */
float
eval (char posf[])
{
int n = strlen(posf);
int i;
/* pilha de execucao */
float *pilha = malloc(n * sizeof(float)); /* ou sizeof(double) */
int topo = 0;
float resultado; /* ou double */
for (i = 0; i < n ; i++)
{
if ('A' <= posf[i] && posf[i] <= 'Z')
{
pilha[topo++] = tabela[posf[i]-'A']; /* valor da variavel */
}
else
{
float valor1 = pilha[--topo];
float valor2 = pilha[--topo];
if (posf[i] == '+')
{
pilha[topo++] = valor1 + valor2;
}
else if (posf[i] == '-')
{
pilha[topo++] = valor1 - valor2;
}
else if (posf[i] == '/')
{
/* supoe valor2 != 0 */
pilha[topo++] = valor1 / valor2;
}
else if (posf[i] == '*')
{
pilha[topo++] = valor1 * valor2;
}
}
}
resultado = pilha[topo--]; /* se tudo estiver ok é pilha[0] */
free(pilha);
return resultado;
}
/*
Esta versao explora mais claramente que posf e um ponteiro
*/
float
eval2 (char posf[]) /* o Kernighan e Ritchie preferem (char *posf) */
{
/* pilha de execucao */
float *pilha = malloc(strlen(posf) * sizeof(float));
int topo = 0;
float resultado;
for ( ; *posf; posf++) /* usa que '\0' == 0 */
{
if ('A' <= *posf && *posf <= 'Z')
{
pilha[topo++] = tabela[*posf-'A']; /* valor da variavel */
}
else
{
float valor1 = pilha[--topo];
float valor2 = pilha[--topo];
if (*posf == '+')
{
pilha[topo++] = valor1 + valor2;
}
else if (*posf == '-')
{
pilha[topo++] = valor1 - valor2;
}
else if (*posf == '/')
{
/* supoe valor2 != 0 */
pilha[topo++] = valor1 / valor2;
}
else if (*posf == '*')
{
pilha[topo++] = valor1 * valor2;
}
}
}
resultado = pilha[topo--]; /* se tudo estiver ok é pilha[0] */
free(pilha);
return resultado;
}