Me parece que eso tampoco va a funcionar, porque se sobreescriben los elementos de la primer mitad, los cuales se pierdren y no pueden ser copiados a la segunda mitad.
Cuando finalmente se copian, se trata de los caracteres modificados, lo cual queda mal.
Por ejemplo, "mundo" se convierte en "odndo".
Además, la cadena queda guardada como array de caracteres, con los índices yendo desde 0 hasta strlen(cad) - 1, así que el índice i debe comenzar en 0.
En realidad eso estaba bien, porque ingmarov pone "i-1" y con eso se arregla el índice.
De todos modos, yo uso siempre en C los índices de 0 hasta strlen(array) - 1, poniendo "i" en el índice, así que mi código sería éste:
Se necesita una variable temporal:
int i, temp, len;
ultimo = strlen(cad) - 1;
for(i=0; i < strlen(cad); i++){
temp = cadinv[i];
cadinv[i]=cad[ultimo - i];
cad[ultimo - i] = temp;
}