Juba programmeerimiskeelest BASIC tuntud käsk goto on ka C - keeles olemas, kuid seda ei soovitata kasutada. See käsk muudab programmi teksti sageli raskesti loetavaks. Käsu goto kasutamiseks tuleb defineerida märk ja seejärel kasutada selle märgi nime käsuga goto.
goto <märgi nimi> <laused> <märk>: <laused>
Märkide nimed on kehtivad vaid hetkelises blokis või funktsioonis. Ka käsuga goto saab luua tsükleid, näiteks:
int i=0;
...
start:
i++;
if(i < 5)
goto start;
Toodud näites jätkab käsk goto programmi täitmist märgist start niikaua, kuni muutuja i väärtus on väiksem viiest. Nagu juba öeldud, ei soovitata selliste tsüklite loomist. Kõiki käsuga goto loodud tsükleid jms. saab luua ka võtmesõnade while, do...while, for, break ja continue abil. Ainus koht, kus käsku goto vahel kasutatakse, on mitme üksteise sisse loodud tsükli seest "väljahüppamine" vea puhul. Ka funktsioonides, kus erinevate vigade puhul osaliselt järgneb sama vastus, võib käsu goto abil programmi teksti tunduvalt lühendada ja lihtsustada. Näiteks:
char* func1(int i, int j)
{ /* hangib i * j suuruse välja jaoks sobiva mälubloki */
char *pBuf;
int k, l;
for(k = 0; k < i; i++) {
for(l = 0; l < j; j++) {
/* suurenda mälublokki */
if(NULL == (pBuf = realloc(pBuf, k * l, sizeof(char))))
/* kui mälu ei jätku, siis jätka märgist "error" */
goto error;
}
}
goto end; /* "hüppa" märgini end kui vigu ei ole */
error: /* tehtud on mingi viga - mälu ei jätkunud */
free pBuf; /* vabasta kogu mälublokk ja */
return NULL; /* loovuta väärtus NULL teatamaks veast */
end: /* loovuta viit hangitud mälublokile */
return pBuf;
}