U Ciebie char *sig powinien nazywać się poprostu temp, tmp lub pom.
Na koniec wypisujesz odwrócony ciąg ale w pamięci jest prawidłowy, więc nawet nie trzeba go odwracać, jak napisałem wcześniej.
PS
Jeżeli funkcją malloc alokujemy pamięć na string, to musimy zaalokować jej co najmniej o 1 więcej, niż długość stringa, bo przecież na końcu stringa jest jeszcze jeden znak, znak = 0. Dodatkowo, ponieważ malloc tylko przydziela obszar pamięci, ale go nie zeruje, musimy to zero wpisać ręcznie na końcu stringa. W takim razie, tylko poprawka malloc(k+1], tab[k] = 0 ... free będzie działać tak jak chciałeś. A dlaczego, w takim razie nie ma SIGABORT SIGKILL czy jakiegoś podobnego sygnału? Nie wiem, ale "normalnie" takie zdarzenia najczęściej nie są w ogóle sygnalizowane [aby program nie tracił czasu indeksy nie są sprawdzane] i dopiero doinstalowanie odpowiednij biblioteki może wymusić takie zachowanie.
PS2
Ps: Czy małe serduszko ma jakiś wpływ na statystyki ;> czy tylko na nasze samopoczucie? ^^
Hym. Nic nie wiem o statystykach, ale dobre uczynki zostaną nam policzone i nagrodzone?
Ma to jednak dodatkowo wpływ na komunikatywność. Ty nie musisz pisać, dzięki, pomogło, tylko klikasz w serduszko, a ja wim, że byłem w jakimś stopniu pomocny i że w ogóle przeczytałeś moją podpowiedż i Cię usatysfakcjonowała, a jeżeli za mało, to pytasz dalej.
PS 3
Możesz trochę skrócić kod, np:
zamiast:
char temp;
temp = *x;
możesz
char temp = *x;
swap((a+l), (a+i)) <==> swap (a+l, a+i)
*(a+(i+1)) <==> *(a+i+1)
*(a+(r-1)) <==> *(a+r-1)
zamiast:
for(int i=0; i<k;i++)
{
tab[i]= 97+i;
}
możesz
for(int i=0; i<k;i++)
tab[i]= 97+i; // a lepiej tab[i] = 'a' + i;
A jeżeli już to ja pewnie napisałbym to jakoś tak:
for (int i = 0; i < k; ++i) { //<-- nawias w tej linii
tab [i] = 'a' + i; // tu może trochę zaszalałem [ze spacjami] ;-)
/// inne operacje
}
Chyba, że wolisz, żeby za ciebie robiło to twoje ukochane ide, ale jak kocha[ne] to powinno się dać ustawić i dostosować do Ciebie a nie Ty do niego[ej], lub trzeba zmienić na inną[go] 