Portál AbcLinuxu, 8. května 2025 22:22
Nevidim jinou moznost nez je chyba ve funkci palindrom. Ten zminovany kousek kodu s mym doplnenim chodi
Chodi to bez toho filtru?
Kam ukazuje "retez"? Asi by bylo vhodne ho pokazde alespon zinicializovat retez[0] = '\0'; Takhle to chodit nebude, bo tam bude odpad odminula
zopakuju to jeste jednou :)
Promene vzdy pred pouzitim inicializuj, jinak nevis s cim mas tu cest.
proste, a sproste:
char retez[delka];
retez[0] = '\0';
Nejni zac :)
Jinak vysvetleni je proste - to pole bylo alokovano na stacku (coz nerozhoduje, ono malloc by to udelal stejne). Stack se necisti pri vytvareni promennych, protoze je to drahe (a jazyk obecne nemuze tusit co za hodnotu autor zamyslel mit v te promenne jako vychozi). Pomocny printf tam na stack zrejme zapisoval nulu, coz !nahodou! zpusobilo ze to pracovalo. Tohle je rek bych tipicka ukazka chyby kterou (kdyby to nahodou fungovalo vzdy, a nebyla by odhalena) by nekdo mohl exploitem zneuzit.
Valgrind by tuhle chybu odhalil, doporucuju ho nastudovat a vyzkouset.
Vsak si srovnej jeho verzi s tou svoji :)
Valgrind je nastroj na (mimo jine) sledovani chyb prace s pameti - odhali ze kod pracuje s neinicializovanou pameti, uvolnenou pameti, mimo rozsah dany alokaci, atd.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.