Поддерживать
www.wikidata.ru-ru.nina.az
U etogo termina sushestvuyut i drugie znacheniya sm Si Zapros Yazyk programmirovaniya Si perenapravlyaetsya syuda o knige sm Yazyk programmirovaniya Si kniga Si ot lat bukvy C angl yazyka kompiliruemyj staticheski tipizirovannyj yazyk programmirovaniya obshego naznacheniya razrabotannyj v 1969 1973 godah sotrudnikom Bell Labs Dennisom Ritchi kak razvitie yazyka Bi Pervonachalno byl razrabotan dlya realizacii operacionnoj sistemy UNIX no vposledstvii byl perenesyon na mnozhestvo drugih platform Soglasno dizajnu yazyka ego konstrukcii blizko sopostavlyayutsya tipichnym mashinnym instrukciyam blagodarya chemu on nashyol primenenie v proektah dlya kotoryh byl svojstvenen yazyk assemblera v tom chisle kak v operacionnyh sistemah tak i v razlichnom prikladnom programmnom obespechenii dlya mnozhestva ustrojstv ot superkompyuterov do vstraivaemyh sistem Yazyk programmirovaniya Si okazal sushestvennoe vliyanie na razvitie industrii programmnogo obespecheniya a ego sintaksis stal osnovoj dlya takih yazykov programmirovaniya kak C C Java i Objective C CKlass yazyka procedurnyjTip ispolneniya kompiliruemyjPoyavilsya v 1972Avtor Dennis RitchiRazrabotchik Bell Labs Dennis Ritchi Nacionalnyj institut standartov SShA ISO i Ken TompsonRasshirenie fajlov c dlya fajlov koda h dlya zagolovochnyh fajlovVypusk ISO IEC 9899 2018 5 iyulya 2018 goda Sistema tipov staticheskaya slabayaOsnovnye realizacii GCC Clang MSVC TCC Turbo C Watcom Oracle Solaris Studio C Pelles CDialekty K amp R C 1978 ANSI C 1989 C99 1999 C11 2011 Ispytal vliyanie BCPL BPovliyal na C Objective C C Java NimSajt iso org standard 74528 h open std org jtc1 sc22 w OS Windows i Unix podobnaya operacionnaya sistema Mediafajly na VikiskladeISO IEC 9899Information technology Programming languages CIzdatel Mezhdunarodnaya organizaciya po standartizacii ISO Sajt www iso orgKomitet razrabotchik ISO IEC JTC 1 SC 22Sajt komiteta Programming languages their environments and system software interfaces35 060Tekushaya redakciyaPredydushie redakcii ISO IEC 9899 1990 COR2 1996 ISO IEC 9899 1999 COR3 2007 ISO IEC 9899 2011 COR1 2012IstoriyaOsnovnaya statya Istoriya yazyka Si Yazyk programmirovaniya Si razrabatyvalsya v period s 1969 po 1973 gody v laboratoriyah Bell Labs i k 1973 godu na etot yazyk byla perepisana bolshaya chast yadra UNIX pervonachalno napisannogo na assemblere PDP 11 20 Nazvanie yazyka stalo logicheskim prodolzheniem starogo yazyka Bi mnogie osobennosti kotorogo byli polozheny v osnovu Po mere razvitiya yazyk snachala standartizirovali kak ANSI C a zatem etot standart byl prinyat komitetom po mezhdunarodnoj standartizacii ISO kak ISO C stavshij takzhe izvestnym pod nazvaniem C90 V standarte S99 yazyk poluchil novye vozmozhnosti takie kak massivy peremennoj dliny i vstraivaemye funkcii A v standarte C11 v yazyk dobavili realizaciyu potokov i podderzhku atomarnyh tipov Odnako s teh por yazyk razvivaetsya medlenno i v standart C18 popali lish ispravleniya oshibok standarta C11 Obshie svedeniyaYazyk Si razrabatyvalsya kak yazyk sistemnogo programmirovaniya dlya kotorogo mozhno sozdat odnoprohodnyj kompilyator Standartnaya biblioteka takzhe nevelika Kak sledstvie dannyh faktorov kompilyatory razrabatyvayutsya sravnitelno legko Poetomu dannyj yazyk dostupen na samyh razlichnyh platformah K tomu zhe nesmotrya na svoyu nizkourovnevuyu prirodu yazyk orientirovan na perenosimost Programmy sootvetstvuyushie standartu yazyka mogut kompilirovatsya pod razlichnye arhitektury kompyuterov Celyu yazyka bylo oblegchenie napisaniya bolshih programm s minimizaciej oshibok po sravneniyu s assemblerom sleduya principam procedurnogo programmirovaniya no izbegaya vsego chto mozhet privesti k dopolnitelnym nakladnym rashodam specifichnym dlya yazykov vysokogo urovnya Osnovnye osobennosti Si prostaya yazykovaya baza iz kotoroj v standartnuyu biblioteku vyneseny mnogie sushestvennye vozmozhnosti vrode matematicheskih funkcij ili funkcij raboty s fajlami orientaciya na procedurnoe programmirovanie sistema tipov predohranyayushaya ot bessmyslennyh operacij ispolzovanie preprocessora dlya abstragirovaniya odnotipnyh operacij dostup k pamyati cherez ispolzovanie ukazatelej nebolshoe chislo klyuchevyh slov peredacha parametrov v funkciyu po znacheniyu a ne po ssylke peredacha po ssylke emuliruetsya s pomoshyu ukazatelej nalichie ukazatelej na funkcii i staticheskie peremennye oblasti vidimosti imyon struktury i obedineniya opredelyaemye polzovatelem sobiratelnye tipy dannyh kotorymi mozhno manipulirovat kak odnim celym V to zhe vremya v Si otsutstvuyut vlozhennye funkcii pryamoe vozvrashenie neskolkih znachenij iz funkcij soprogrammy sredstva avtomaticheskogo upravleniya pamyatyu vstroennye sredstva obektno orientirovannogo programmirovaniya sredstva funkcionalnogo programmirovaniya Chast otsutstvuyushih vozmozhnostej mozhet imitirovatsya vstroennymi sredstvami naprimer soprogrammy mozhno imitirovat s pomoshyu funkcij setjmp i longjmp chast dobavlyaetsya s pomoshyu storonnih bibliotek naprimer dlya podderzhki mnogozadachnosti i dlya setevyh funkcij mozhno ispolzovat biblioteki pthreads sockets i tomu podobnye sushestvuyut biblioteki dlya podderzhki avtomaticheskoj sborki musora chast realizuetsya v nekotoryh kompilyatorah v vide rasshirenij yazyka naprimer vlozhennye funkcii v GCC Sushestvuet neskolko gromozdkaya no vpolne rabotosposobnaya metodika pozvolyayushaya realizovyvat na Si mehanizmy OOP baziruyushayasya na fakticheskoj polimorfnosti ukazatelej v Si i podderzhke v etom yazyke ukazatelej na funkcii Mehanizmy OOP osnovannye na dannoj modeli realizovany v biblioteke GLib i aktivno ispolzuyutsya vo frejmvorke GTK GLib predostavlyaet bazovyj klass GObject vozmozhnosti nasledovaniya ot odnogo klassa i realizacii mnozhestva interfejsov Posle poyavleniya yazyk byl horosho prinyat potomu chto on pozvolyal bystro sozdavat kompilyatory dlya novyh platform a takzhe pozvolyal programmistam dovolno tochno predstavlyat kak vypolnyayutsya ih programmy Blagodarya blizosti k yazykam nizkogo urovnya programmy na Si rabotali effektivnee napisannyh na mnogih drugih yazykah vysokogo urovnya i lish optimizirovannyj vruchnuyu kod na assemblere mog rabotat eshyo bystree potomu chto daval polnyj kontrol nad mashinoj Na segodnyashnij den razvitie kompilyatorov i uslozhnenie processorov privelo k tomu chto vruchnuyu napisannyj assemblernyj kod krome razve chto ochen korotkih programm prakticheski ne vyigryvaet po sravneniyu s kodom generiruemym kompilyatorami pri etom Si prodolzhaet ostavatsya odnim iz naibolee effektivnyh yazykov vysokogo urovnya Sintaksis i semantikaOsnovnaya statya Sintaksis i semantika yazyka Si Sintaksis yazyka Si dostatochno slozhnyj a semantika neodnoznachnaya Osnovnymi dvumya osobennostyami yazyka na moment ego poyavleniya byli unificirovanie raboty s massivami i ukazatelyami a takzhe shozhest togo kak chto libo obyavlyaetsya s tem kak eto v dalnejshem ispolzuetsya v vyrazheniyah Odnako v posleduyushem eti dve osobennosti yazyka byli v chisle naibolee kritikuemyh i obe yavlyayutsya slozhnymi dlya ponimaniya sredi nachinayushih programmistov Standart yazyka opredelyaya ego semantiku ne stal slishkom silno ogranichivat realizacii yazyka kompilyatorami no etim samym sdelal semantiku nedostatochno opredelyonnoj V chastnosti v standarte est 3 tipa nedostatochno opredelyonnoj semantiki opredelyaemoe realizaciej povedenie ne zadannoe standartom povedenie i neopredelyonnoe povedenie Tipy dannyhOsnovnaya statya Sistema tipov Si Primitivnye tipy Celye chisla Razmer celochislennyh tipov dannyh variruetsya ot ne menee 8 do ne menee 32 bit Standart C99 uvelichivaet maksimalnyj razmer celogo chisla ne menee 64 bit Celochislennye tipy dannyh ispolzuyutsya dlya hraneniya celyh chisel tip char takzhe ispolzuetsya dlya hraneniya ASCII simvolov Vse razmery diapazonov predstavlennyh nizhe tipov dannyh minimalny i na otdelno vzyatoj platforme mogut byt bolshe Kak sledstvie minimalnyh razmerov tipov standart trebuet chtoby dlya razmerov celochislennyh tipov vypolnyalos uslovie 1 span class k sizeof span span class p span span class kt char span span class p span span class k sizeof span span class p span span class kt short span span class p span span class k sizeof span span class p span span class kt int span span class p span span class k sizeof span span class p span span class kt long span span class p span span class k sizeof span span class p span span class kt long span span class w span span class kt long span span class p span Takim obrazom razmery nekotoryh tipov po kolichestvu bajt mogut sovpadat esli budet udovletvoryatsya uslovie po minimalnomu kolichestvu bit Dazhe char i long mogut imet odinakovyj razmer esli odin bajt budet zanimat 32 bita ili bolee no takie platformy budut ochen redki ili ne budut sushestvovat Standart garantiruet chto tip char vsegda raven 1 bajtu Razmer bajta v bitah opredelyaetsya konstantoj CHAR BIT iz zagolovochnogo fajla a href wiki Limits h title Limits h limits h a u POSIX sovmestimyh sistem raven 8 bitam Minimalnyj diapazon znachenij celyh tipov po standartu opredelyaetsya s 2 sup N 1 sup 1 po 2 sup N 1 sup 1 dlya znakovyh tipov i s 0 po 2 sup N sup 1 dlya bezznakovyh gde N razryadnost tipa Realizaciya kompilyatorov mozhet rasshiryat etot diapazon po svoemu usmotreniyu Na praktike dlya znakovyh tipov chashe ispolzuetsya diapazon s 2 sup N 1 sup po 2 sup N 1 sup 1 Minimalnoe i maksimalnoe znacheniya kazhdogo tipa ukazyvaetsya v fajle a href wiki Limits h title Limits h limits h a v vide makroopredelenij Otdelnoe vnimanie stoit udelit tipu char Formalno eto otdelnyj tip no fakticheski char ekvivalenten libo signed char libo unsigned char v zavisimosti ot kompilyatora Dlya togo chtoby izbezhat putanicy mezhdu razmerami tipov standart C99 vvel novye tipy dannyh opisannye v fajle a href wiki Stdint h title Stdint h stdint h a Sredi nih takie tipy kak int i N i t int least i N i t int fast i N i t gde N 8 16 32 ili 64 Pristavka least oboznachaet minimalnyj tip sposobnyj vmestit N bit pristavka fast oboznachaet tip razmerom ne menee 16 bit rabota s kotorym naibolee bystraya na dannoj platforme Tipy bez pristavok oboznachayut tipy s fiksirovannom razmerom ravnym N bit Tipy s pristavkami least i fast mozhno schitat zamenoj tipam int short long s toj lish raznicej chto pervye dayut programmistu vybrat mezhdu skorostyu i razmerom Osnovnye tipy dannyh dlya hraneniya celyh chisel Tip dannyh Razmer Minimalnyj diapazon znachenij Standartsigned char minimum 8 bit ot 127 27 1 do 127 C90int least8 t C99int fast8 tunsigned char minimum 8 bit ot 0 do 255 28 1 C90uint least8 t C99uint fast8 tchar minimum 8 bit ot 127 do 127 ili ot 0 do 255 v zavisimosti ot kompilyatora C90short int minimum 16 bit ot 32 767 215 1 do 32 767 C90intint least16 t C99int fast16 tunsigned short int minimum 16 bit ot 0 do 65 535 216 1 C90unsigned intuint least16 t C99uint fast16 tlong int minimum 32 bita ot 2 147 483 647 do 2 147 483 647 C90int least32 t C99int fast32 tunsigned long int minimum 32 bita ot 0 do 4 294 967 295 232 1 C90uint least32 t C99uint fast32 tlong long int minimum 64 bita ot 9 223 372 036 854 775 807 do 9 223 372 036 854 775 807 C99int least64 tint fast64 tunsigned long long int minimum 64 bita ot 0 do 18 446 744 073 709 551 615 264 1 uint least64 tuint fast64 tint8 t 8 bit ot 127 do 127uint8 t 8 bit ot 0 do 255 28 1 int16 t 16 bit ot 32 767 do 32 767uint16 t 16 bit ot 0 do 65 535 216 1 int32 t 32 bita ot 2 147 483 647 do 2 147 483 647uint32 t 32 bita ot 0 do 4 294 967 295 232 1 int64 t 64 bita ot 9 223 372 036 854 775 807 do 9 223 372 036 854 775 807uint64 t 64 bita ot 0 do 18 446 744 073 709 551 615 264 1 V tablice privedyon minimalnyj diapazon znachenij soglasno standartu yazyka Kompilyatory yazyka Si mogut rasshiryat diapazon znachenij Vspomogatelnye celochislennye tipy Takzhe so standarta C99 dobavleny tipy intmax t i uintmax t sootvetstvuyushie samym bolshim znakovomu i bezznakovomu tipam sootvetstvenno Dannye tipy udobny pri ispolzovanii v makrosah dlya hraneniya promezhutochnyh ili vremennyh znachenij pri operaciyah nad celochislennymi argumentami tak kak pozvolyayut umestit znacheniya lyubogo tipa Naprimer eti tipy ispolzuyutsya v makrosah sravneniya celochislennyh znachenij biblioteki modulnogo testirovaniya Check dlya yazyka Si V Si sushestvuet neskolko dopolnitelnyh celochislennyh tipov dlya bezopasnoj raboty s tipom dannyh ukazatelej intptr t uintptr t i ptrdiff t Tipy intptr t i uintptr t iz standarta C99 prednaznacheny dlya hraneniya sootvetstvenno znakovogo i bezznakovogo znachenij kotorye po razmeru mogut umestit v sebe ukazatel Eti tipy chasto primenyayutsya dlya hraneniya proizvolnogo celogo chisla v ukazatele naprimer kak sposob izbavitsya ot lishnego vydeleniya pamyati pri registracii funkcij obratnoj svyazi libo pri ispolzovanii storonnih svyaznyh spiskov associativnyh massivov i prochih struktur v kotoryh dannye hranyatsya po ukazatelyu Tip ptrdiff t iz zagolovochnogo fajla a href wiki Stddef h title Stddef h stddef h a prednaznachen dlya bezopasnogo hraneniya raznosti dvuh ukazatelej Dlya hraneniya razmera predusmotren bezznakovyj tip size t iz zagolovochnogo fajla stddef h Dannyj tip sposoben umestit maksimalno vozmozhnoe kolichestvo bajt dostupnoe po ukazatelyu i obychno ispolzuetsya dlya hraneniya razmera v bajtah Znachenie imenno etogo tipa vozvrashaet operator sizeof Privedenie celochislennyh tipov Preobrazovaniya celochislennyh tipov mogut proishodit kak yavno s pomoshyu operatora privedeniya tipov tak i neyavno Znacheniya tipov menshih po razmeru chem int pri uchastii v kakih libo operaciyah ili pri peredache v vyzov funkcii avtomaticheski privodyatsya k tipu int a v sluchae nevozmozhnosti preobrazovaniya k tipu unsigned int Zachastuyu podobnye neyavnye privedeniya neobhodimy chtoby rezultat vychisleniya okazalsya pravilnym no inogda privodyat k intuitivno neponyatnym oshibkam v vychisleniyah Naprimer esli v operacii uchastvuyut chisla tipa int i unsigned int a znakovoe znachenie otricatelno to preobrazovanie otricatelnogo chisla k bezznakovomu tipu privedyot k perepolneniyu i vozniknoveniyu ochen bolshogo polozhitelnogo znacheniya chto mozhet privesti k nevernomu rezultatu operacij sravneniya Sravnenie pravilnogo i oshibochnogo avtomaticheskogo privedeniya tipov Znakovyj i bezznakovyj tipy menshe chem int Znakovyj menshe bezznakovogo a bezznakovyj ne menee int include lt stdio h gt signed char x 1 unsigned char y 0 if x gt y uslovie lozhno printf Soobshenie ne budet pokazano n if x UCHAR MAX uslovie lozhno printf Soobshenie ne budet pokazano n include lt stdio h gt signed char x 1 unsigned int y 0 if x gt y uslovie istinno printf Perepolnenie v peremennoj x n if x UINT MAX amp amp x ULONG MAX uslovie vsegda budet istinnym printf Perepolnenie v peremennoj x n V dannom primere oba tipa znakovyj i bezznakovyj budut privedeny k znakovomu tipu int poskolku on pozvolyaet umestit diapazony oboih tipov Poetomu sravnenie v uslovnom operatore budet korrektnym Znakovyj tip budet privedyon k bezznakovomu poskolku bezznakovyj bolshe ili raven po razmeru tipu int no proizojdyot perepolnenie poskolku v bezznakovom tipe nevozmozhno predstavit otricatelnoe znachenie Takzhe avtomaticheskoe privedenie tipov srabotaet esli v vyrazhenii ispolzuetsya dva ili bolee raznyh celochislennyh tipa Standart opredelyaet ryad pravil soglasno kotorym vybiraetsya takoe preobrazovanie tipov kotoroe mozhet dat pravilnyj rezultat vychislenij Raznym tipam naznacheny raznye rangi v ramkah preobrazovaniya a sami rangi osnovany na razmere tipa Pri uchastii v vyrazhenii raznyh tipov obychno vybiraetsya privedenie etih znachenij k tipu bolshego ranga Veshestvennye chisla Chisla s plavayushej zapyatoj v yazyke Si predstavleny tremya osnovnymi tipami float double i long double Veshestvennye chisla imeyut predstavlenie silno otlichayushee ih ot celyh Konstanty veshestvennyh chisel raznyh tipov zapisannye v desyatichnom predstavlenii mogut byt ne ravny drug drugu Naprimer uslovie 0 1 0 1f budet lozhnym iz za poteri tochnosti u tipa float v to vremya kak uslovie 0 5 0 5f budet istinnym poskolku eti chisla konechny v dvoichnom predstavlenii Odnako uslovie s privedeniem float 0 1 0 1f takzhe budet istinnym poskolku pri privedenii tipa k menee tochnomu teryayutsya razryady iz za kotoryh v etih dvuh konstantah est razlichiya Arifmeticheskie operacii s veshestvennymi chislami takzhe yavlyayutsya netochnymi i zachastuyu imeyut nekotoruyu plavayushuyu pogreshnost Naibolshaya pogreshnost budet voznikat pri operaciyah nad znacheniyami blizkimi k minimalno vozmozhnomu dlya konkretnogo tipa Takzhe pogreshnost mozhet okazatsya bolshoj pri vychisleniyah nad odnovremenno ochen malenkimi 1 i ochen bolshimi po modulyu chislami 1 V ryade sluchaev pogreshnost mozhet byt snizhena izmeneniem algoritmov i metodik vychislenij Naprimer pri zamene mnogokratnogo slozheniya umnozheniem pogreshnost mozhet snizitsya vo stolko raz skolko iznachalno bylo operacij slozheniya Takzhe v zagolovochnom fajle a href wiki Math h title Math h math h a prisutstvuyut dva dopolnitelnyh tipa float t i double t kotorye sootvetstvuyut kak minimum tipam float i double sootvetstvenno no mogut byt otlichnymi ot nih Tipy float t i double t dobavleny v standarte C99 a ih sootvetstvie osnovnym tipam opredelyaetsya znacheniem makrosa FLT EVAL METHOD Veshestvennye tipy dannyh Tip dannyh Razmer Standartfloat 32 bita IEC 60559 IEEE 754 rasshirenie F standarta Si chislo odinarnoj tochnostidouble 64 bita IEC 60559 IEEE 754 rasshirenie F standarta Si chislo dvojnoj tochnostilong double minimum 64 bita zavisit ot realizaciifloat t C99 minimum 32 bita zavisit ot bazovogo tipadouble t C99 minimum 64 bita zavisit ot bazovogo tipaSootvetstvie dopolnitelnyh tipov bazovym FLT EVAL METHOD float t double t1 float double2 double double3 long double long doubleStroki Nul terminirovannye stroki Osnovnaya statya Nul terminirovannaya stroka Hotya kak takovogo specialnogo tipa dlya strok v Si ne predusmotreno v yazyke aktivno ispolzuyutsya nul terminirovannye stroki ASCII stroki obyavlyayutsya kak massiv tipa char poslednim elementom kotorogo dolzhen byt simvol s kodom 0 0 V etom zhe formate prinyato hranit i stroki v formate UTF 8 Odnako vse funkcii rabotayushie s ASCII strokami rassmatrivayut kazhdyj simvol kak bajt chto ogranichivaet primenenie standartnyh funkcij pri ispolzovanii dannoj kodirovki Nesmotrya na shirokoe rasprostranenie idei nul terminirovannyh strok i udobstvo ih ispolzovaniya v nekotoryh algoritmah u nih est neskolko seryoznyh nedostatkov Neobhodimost dobavleniya v konec stroki terminalnogo simvola ne dayot vozmozhnost poluchit podstroku bez neobhodimosti eyo kopirovaniya a funkcij dlya raboty s ukazatelem na podstroku i eyo dlinoj v yazyke ne predusmotreno Esli trebuetsya zaranee vydelyat pamyat pod rezultat algoritma na osnove vhodnyh dannyh kazhdyj raz trebuetsya obhodit vsyu stroku dlya podschyota eyo dliny Pri rabote s bolshimi obyomami teksta podschyot dliny mozhet okazatsya uzkim mestom Rabota so strokoj kotoraya po oshibke ne terminirovana nulyom mozhet privodit k neopredelyonnomu povedeniyu programmy v tom chisle k oshibkam segmentirovaniya oshibkam perepolneniya bufera i k uyazvimostyam V sovremennyh usloviyah kogda proizvoditelnost koda prioritetnee rashoda pamyati mozhet okazatsya effektivnee i proshe ispolzovat struktury soderzhashie v sebe kak samu stroku tak i eyo razmer naprimer struct string t char str ukazatel na stroku size t str size razmer stroki typedef struct string t string t alternativnoe imya dlya uprosheniya koda Alternativnym variantom hraneniya razmera stroki s nizkim potrebleniem pamyati mozhet okazatsya podhod dobavleniya v nachalo stroki eyo razmera v formate angl Podobnyj podhod primenyaetsya v protokolnyh buferah odnako tolko na etape peredachi dannyh no ne ih hraneniya Strokovye literaly Strokovye literaly v Si po svoej suti yavlyayutsya konstantami Pri obyavlenii zaklyuchayutsya v dvojnye kavychki a terminiruyushij 0 dobavlyayutsya kompilyatorom avtomaticheski Dopuskaetsya dva sposoba prisvaivaniya strokovogo literala po ukazatelyu i po znacheniyu Pri prisvaivanii po ukazatelyu v peremennuyu tipa char zanositsya ukazatel na neizmenyaemuyu stroku to est formiruetsya konstantnaya stroka Esli zhe zanosit strokovyj literal v massiv to proishodit kopirovanie stroki v oblast steka include lt stdio h gt include lt string h gt int main void const char s1 Konstantnaya stroka char s2 Stroka kotoruyu mozhno menyat memcpy s2 s strlen s zamena pervoj bukvy na malenkuyu puts s2 vyvedetsya tekst stroki memcpy char s1 k strlen k oshibka segmentirovaniya puts s1 stroka ne budet ispolnena Poskolku stroki yavlyayutsya obychnymi massivami simvolov vmesto literalov mozhno ispolzovat inicializatory esli kazhdyj simvol umeshaetsya v 1 bajt char s I n i t i a l i z e r 0 Odnako na praktike takoj podhod imeet smysl tolko v krajne redkih sluchayah kogda k ASCII stroke trebuetsya ne dobavlyat terminiruyushij nol Shirokie stroki Kodirovka tipa wchar t v zavisimosti ot platformy Platforma KodirovkaGNU Linux USC 4macOSWindows USC 2AIXFreeBSD Zavisit ot lokali ne dokumentirovanoSolaris Alternativoj obychnym strokam mogut sluzhit shirokie stroki v kotoryh kazhdyj simvol hranitsya v specialnom tipe wchar t Dannyj tip po standartu dolzhen byt sposoben umestit v sebe vse simvoly samoj bolshoj iz sushestvuyushih lokalej Funkcii dlya raboty s shirokimi strokami opisany v zagolovochnom fajle a href wiki Wchar h title Wchar h wchar h a a funkcii dlya raboty s shirokimi simvolami opisany v zagolovochnom fajle a href wiki Wctype h title Wctype h wctype h a Pri obyavlenii strokovyh literalov dlya shirokih strok ispolzuetsya modifikator L const wchar t wide str L Shirokaya stroka V formatirovannom vyvode ispolzuetsya specifikator ls odnako specifikator razmera esli zadan ukazyvaetsya v bajtah a ne v simvolah Tip wchar t zadumyvalsya dlya togo chtoby v nego mog pomestitsya lyuboj simvol a shirokie stroki dlya hraneniya strok lyuboj lokali no v rezultate API okazalsya neudobnym a realizacii platformozavisimymi Tak na platforme Windows v kachestve razmera tipa wchar t bylo vybrano 16 bit a pozzhe poyavilsya standart UTF 32 takim obrazom tip wchar t na platforme Windows uzhe ne sposoben umestit v sebe vse simvoly iz kodirovki UTF 32 v rezultate chego teryaetsya smysl dannogo tipa V to zhe vremya na platformah Linux i macOS dannyj tip zanimaet 32 bita poetomu dlya realizacii krossplatformennyh zadach tip wchar t ne podhodit Mnogobajtovye stroki Sushestvuet mnogo raznyh kodirovok v kotoryh otdelnyj simvol mozhet byt zaprogrammirovan raznym kolichestvom bajt Takie kodirovki nazyvayutsya mnogobajtovymi K nim otnositsya takzhe i UTF 8 V Si sushestvuet nabor funkcij dlya preobrazovaniya strok iz mnogobajtovyh v ramkah tekushej lokali v shirokie i naoborot Funkcii dlya raboty s mnogobajtovymi simvolami imeyut prefiks libo suffiks mb i opisany v zagolovochnom fajle a href wiki Stdlib h title Stdlib h stdlib h a Dlya podderzhki mnogobajtovyh strok v programmah na yazyke Si takie stroki dolzhny podderzhivatsya na urovne tekushej lokali Dlya yavnogo zadaniya kodirovki mozhno menyat tekushuyu lokal s pomoshyu funkcii setlocale iz zagolovochnogo fajla a href wiki Locale h title Locale h locale h a Odnako zadanie kodirovki dlya lokali dolzhno podderzhivatsya ispolzuemoj standartnoj bibliotekoj Tak naprimer standartnaya biblioteka Glibc polnostyu podderzhivaet kodirovku UTF 8 i sposobna preobrazovyvat tekst vo mnozhestvo drugih kodirovok Nachinaya so standarta C11 yazyk podderzhivaet takzhe 16 bitnye i 32 bitnye shirokie mnogobajtovye stroki s sootvetstvuyushimi tipami simvola char16 t i char32 t iz zagolovochnogo fajla a href wiki Uchar h title Uchar h uchar h a a takzhe obyavlenie strokovyh literalov v formate UTF 8 s pomoshyu modifikatora u8 16 bitnye i 32 bitnye stroki mogut ispolzovatsya dlya hraneniya kodirovok UTF 16 i UTF 32 esli v zagolovochnom fajle uchar h zadany makroopredeleniya STDC UTF 16 i STDC UTF 32 sootvetstvenno Dlya zadaniya strokovyh literalov v dannyh formatah ispolzuyutsya modifikatory u dlya 16 bitnyh strok i U dlya 32 bitnyh strok Primery obyavleniya strokovyh literalov dlya mnogobajtovyh strok const char s8 u8 Mnogobajtovaya stroka v kodirovke UTF 8 const char16 t s16 u 16 bitnaya mnogobajtovaya stroka const char32 t s32 U 32 bitnaya mnogobajtovaya stroka Sleduet imet v vidu chto funkciya c16rtomb dlya preobrazovaniya iz 16 bitnoj stroki v mnogobajtovuyu rabotaet ne tak kak zadumyvalos i v standarte C11 okazalas nesposobnoj perevodit iz UTF 16 v UTF 8 Ispravlenie raboty dannoj funkcii mozhet zaviset ot konkretnoj realizacii kompilyatora Polzovatelskie tipy Perechisleniya Perechisleniya predstavlyayut soboj nabor imenovannyh celochislennyh konstant i oboznachayutsya s pomoshyu klyuchevogo slova enum Esli konstante ne sopostavleno chislo to ej avtomaticheski zadayotsya libo 0 dlya pervoj konstanty v spiske libo chislo na edinicu bo lshee chem zadano v predydushej konstante Pri etom sam tip dannyh perechisleniya po faktu mozhet sootvetstvovat lyubomu znakovomu ili bezznakovomu primitivnomu tipu v diapazon kotorogo umeshayutsya vse znacheniya perechislenij reshenie o vybore togo ili inogo tipa prinimaet kompilyator Odnako yavno zadannye znacheniya dlya konstant dolzhny byt vyrazheniyami tipa int Tip perechisleniya mozhet byt takzhe anonimnym esli ne ukazano nazvanie perechisleniya Konstanty ukazannye v dvuh raznyh perechisleniyah otnosyatsya k dvum raznym tipam dannyh nezavisimo ot togo yavlyayutsya li perechisleniya imenovannymi ili anonimnymi Na praktike perechisleniya chasto ispolzuyutsya dlya oboznacheniya sostoyanij konechnyh avtomatov dlya zadaniya variantov rezhimov raboty ili znachenij parametrov dlya sozdaniya celochislennyh konstant a takzhe dlya perechisleniya kakih libo unikalnyh obektov ili svojstv Struktury Struktury predstavlyayut soboj obedinenie peremennyh raznyh tipov dannyh v ramkah odnoj oblasti pamyati oboznachayutsya klyuchevym slovom struct Peremennye vnutri struktury nazyvayutsya polyami struktury S tochki zreniya adresnogo prostranstva polya vsegda idut drug za drugom v tom zhe poryadke v kotorom ukazany no kompilyatory mogut vyravnivat adresa polej dlya optimizacii pod tu ili inuyu arhitekturu Takim obrazom fakticheski pole mozhet zanimat bo lshij razmer chem ukazano v programme Kazhdoe pole imeet opredelyonnoe smeshenie otnositelno adresa struktury i razmer Smeshenie mozhno poluchit s pomoshyu makrosa offsetof iz zagolovochnogo fajla a href wiki Stddef h title Stddef h stddef h a Pri etom smeshenie budet zaviset ot vyravnivaniya i razmera predydushih polej Razmer polya obychno opredelyaetsya vyravnivaniem struktury esli razmer vyravnivaniya tipa dannyh polya menshe znacheniya vyravnivaniya struktury to razmer polya opredelyaetsya vyravnivaniem struktury Vyravnivanie tipov dannyh mozhno poluchit s pomoshyu makrosa alignof iz zagolovochnogo fajla Razmer samoj struktury yavlyaetsya sovokupnym razmerom vseh eyo polej s uchyotom vyravnivaniya Pri etom nekotorye kompilyatory predostavlyayut specialnye atributy pozvolyayushie upakovyvat struktury ubiraya iz nih vyravnivaniya Polyam struktur mozhno yavno zadavat razmer v bitah cherez dvoetochie posle opredeleniya polya i ukazanie kolichestva bit chto ogranichivaet diapazon ih vozmozhnyh znachenij nesmotrya na tip polya Podobnyj podhod mozhet ispolzovatsya kak alternativa flagam i bitovym maskam dlya obrasheniya k nim Odnako ukazanie kolichestva bit ne otmenyaet vozmozhnogo vyravnivaniya polej struktur v pamyati Rabota s bitovymi polyami imeet ryad ogranichenij k nim nevozmozhno primenit operator sizeof ili makros alignof na nih nevozmozhno poluchit ukazatel Obedineniya Obedineniya neobhodimy v teh sluchayah kogda trebuetsya obrashatsya k odnoj i toj zhe peremennoj kak k raznym tipam dannyh oboznachayutsya klyuchevym slovom union Vnutri obedineniya mozhet byt obyavleno proizvolnoe kolichestvo peresekayushihsya polej kotorye po faktu predostavlyayut dostup k odnoj i toj zhe oblasti pamyati kak k raznym tipam dannyh Razmer obedineniya vybiraetsya kompilyatorom ishodya iz razmera samogo bolshogo polya v obedinenii Sleduet imet v vidu chto izmenenie odnogo polya obedineniya privodit k izmeneniyu i vseh drugih polej no garantirovanno pravilnym budet tolko znachenie togo polya kotoroe menyalos Obedineniya mogut sluzhit bolee udobnoj alternativnoj privedeniyu ukazatelya k proizvolnomu tipu K primeru s pomoshyu obedineniya pomeshyonnogo v strukturu mozhno sozdavat obekty s dinamicheski menyayushimsya tipom dannyh Kod struktury dlya izmeneniya tipa dannyh na letu include lt stddef h gt enum value type t VALUE TYPE LONG celoe chislo VALUE TYPE DOUBLE veshestvennoe chislo VALUE TYPE STRING stroka VALUE TYPE BINARY proizvolnye dannye struct binary t void data ukazatel na dannye size t data size razmer dannyh struct string t char str ukazatel na stroku size t str size razmer stroki union value contents t long as long znachenie kak celoe chislo double as double znachenie kak veshestvennoe chislo struct string t as string znachenie kak stroka struct binary t as binary znachenie kak proizvolnye dannye struct value t enum value type t type tip znacheniya union value contents t contents soderzhimoe znacheniya Massivy Massivy v yazyke Si primitivny i yavlyayutsya lish sintaksicheskim abstragirovaniem nad arifmetikoj ukazatelej Sam po sebe massiv yavlyaetsya ukazatelem na oblast pamyati poetomu vsya informaciya o razmernosti massiva i ego granicah mozhet byt dostupna tolko na etape kompilyacii soglasno opisaniyu tipa Massivy mogut byt kak odnomernymi tak i mnogomernymi no obrashenie k elementu massiva svoditsya k prostomu vychisleniyu smesheniya otnositelno adresa nachala massiva Poskolku massivy osnovany na adresnoj arifmetike s nimi vozmozhno rabotat bez ispolzovaniya indeksov Tak naprimer sleduyushie dva primera schityvaniya s potoka vvoda 10 chisel identichny drug drugu Sravnenie raboty cherez indeksy s rabotoj cherez adresnuyu arifmetikojKod primera raboty cherez indeksy Kod primera raboty cherez adresnuyu arifmetiku include lt stdio h gt int a 10 0 Inicializaciya nulyami unsigned int count sizeof a sizeof a 0 for int i 0 i lt count i int ptr amp a i Ukazatel na tekushij elementa massiva int n scanf 8d ptr if n 1 perror Ne udalos schitat znachenie Obrabotka oshibki break include lt stdio h gt int a 10 0 Inicializaciya nulyami unsigned int count sizeof a sizeof a 0 int a end a count Ukazatel na element sleduyushij za poslednim for int ptr a ptr a end ptr int n scanf 8d ptr if n 1 perror Ne udalos schitat znachenie Obrabotka oshibki break Dlina massivov s zaranee izvestnym razmerom vychislyaetsya na etape kompilyacii V standarte C99 poyavilas vozmozhnost obyavlyat massivy peremennoj dliny u kotoryh dlina mozhet zadavatsya na etape vypolneniya Pod takie massivy vydelyaetsya pamyat iz oblasti steka poetomu ih neobhodimo ispolzovat s ostorozhnostyu esli ih razmer mozhet zadavatsya izvne programmy V otlichie ot vydeleniya dinamicheskoj pamyati prevyshenie dopustimogo razmera v oblasti steka mozhet povlech nepredskazuemye posledstviya a otricatelnaya dlina massiva neopredelyonnoe povedenie Nachinaya s C11 massivy peremennoj dliny yavlyayutsya opcionalnymi dlya kompilyatorov a otsutstvie podderzhki opredelyaetsya nalichiem makrosa STDC NO VLA Massivy fiksirovannogo razmera obyavlyaemye kak lokalnye ili globalnye peremennye mozhno inicializirovat zadavaya im nachalnoe znachenie s pomoshyu figurnyh skobok i perechisleniya elementov massiva cherez zapyatuyu V inicializatorah globalnyh massivov dopuskaetsya ispolzovat tolko takie vyrazheniya kotorye vychislyayutsya na etape kompilyacii Peremennye ispolzuemye v takih vyrazheniyah dolzhny obyavlyatsya kak konstanty s modifikatorom const U lokalnyh massivov inicializatory mogut soderzhat vyrazheniya s vyzovami funkcij i ispolzovaniem drugih peremennyh v tom chisle mozhno zanosit ukazatel na sam obyavlyaemyj massiv So standarta C99 poslednim elementom struktur dopuskaetsya obyavlyat massiv proizvolnoj dliny chto shiroko ispolzuetsya na praktike i podderzhivaetsya razlichnymi kompilyatorami Razmer takogo massiva zavisit ot obyoma pamyati vydelyaemogo pod strukturu Pri etom nelzya obyavlyat massiv takih struktur i nelzya ih pomeshat v drugie struktury V operaciyah nad takoj strukturoj massiv proizvolnoj dliny obychno ignoriruetsya v tom chisle i pri vychislenii razmera struktury a vyhod za predely massiva vlechyot za soboj neopredelyonnoe povedenie Yazyk Si ne predusmatrivaet kakogo libo kontrolya vyhoda za predely massiva poetomu programmist sam dolzhen sledit za rabotoj s massivami Oshibki pri obrabotke massivov ne vsegda yavno vliyayut na hod ispolneniya programmy no mogut privodit k oshibkam segmentirovaniya i uyazvimostyam Sinonimy tipov Yazyk Si dopuskaet sozdanie sobstvennyh nazvanij tipov s pomoshyu operatora b typedef b Alternativnye nazvaniya mozhno zadavat kak sistemnym tipam tak i polzovatelskim Takie nazvaniya obyavlyayutsya v globalnom prostranstve imyon i ne konfliktuyut s nazvaniyami tipov struktur perechislenij i obedinenij Alternativnye nazvaniya mogut primenyatsya kak dlya uprosheniya koda tak i dlya sozdaniya urovnej abstrakcii Naprimer nekotorye sistemnye tipy mozhno sokratit dlya povysheniya chitabelnosti koda ili unificirovaniya ego napisaniya v polzovatelskom kode include lt stdint h gt typedef int32 t i32 t typedef int fast32 t i32fast t typedef int least32 t i32least t typedef uint32 t u32 t typedef uint fast32 t u32fast t typedef uint least32 t u32least t Primerom abstragirovaniya mogut sluzhit nazvaniya tipov v zagolovochnyh fajlah operacionnyh sistemah Tak standart POSIX opredelyaet tip pid t prednaznachennyj dlya hraneniya chislovogo identifikatora processa Na samom dele dannyj tip yavlyaetsya alternativnym nazvaniem dlya kakogo libo primitivnogo tipa naprimer typedef int kernel pid t typedef kernel pid t pid t typedef pid t pid t Poskolku tipy s alternativnymi nazvaniyami yavlyayutsya lish sinonimami originalnym tipam to mezhdu nimi sohranyaetsya polnaya sovmestimost i vzaimozamenyaemost PreprocessorOsnovnaya statya Preprocessor Si Preprocessor rabotaet do kompilyacii i preobrazuet tekst fajla programmy soglasno vstrechennym v nyom ili peredannym v preprocessor direktivam Tehnicheski preprocessor mozhet byt realizovan po raznomu no logicheski ego udobno predstavlyat imenno kak otdelnyj modul celikom obrabatyvayushij kazhdyj prednaznachennyj dlya kompilyacii fajl i formiruyushij tekst popadayushij zatem na vhod kompilyatora Preprocessor ishet v tekste stroki nachinayushiesya s simvola vsled za kotorym dolzhny sledovat direktivy preprocessora Vsyo chto ne otnositsya k direktivam preprocessora i ne isklyucheno iz kompilyacii soglasno direktivam peredayotsya na vhod kompilyatora v neizmennom vide V chislo vozmozhnostej preprocessora vhodit podmena zadannoj leksemy tekstom s pomoshyu direktivy define vklyuchaya vozmozhnost sozdaniya parametrizovannyh shablonov teksta vyzyvayutsya analogichno funkciyam a takzhe otmenyat podobnye podmeny chto dayot vozmozhnost osushestvlyat podmenu na ogranichennyh uchastkah teksta programmy uslovnoe vstraivanie i udalenie kuskov iz teksta vklyuchaya sami direktivy s pomoshyu uslovnyh komand ifdef ifndef if else i endif vstraivanie v tekushij fajl teksta iz drugogo fajla s pomoshyu direktivy include Vazhno ponimat chto preprocessor obespechivaet tolko podstanovku teksta ne uchityvaya sintaksis i semantiku yazyka Tak naprimer makroopredeleniya define mogut vstrechatsya vnutri funkcij ili opredelenij tipov a direktivy uslovnoj kompilyacii mogut privodit k isklyucheniyu iz kompiliruemogo teksta programmy lyuboj chasti koda bez oglyadki na grammatiku yazyka Vyzov parametricheskogo makrosa takzhe otlichaetsya ot vyzova funkcii poskolku ne proishodit analiza semantiki argumentov razdelyaemyh zapyatoj Tak naprimer v argumenty parametricheskogo makrosa nevozmozhno peredat inicializaciyu massiva poskolku ego elementy tozhe razdelyayutsya zapyatoj define array of type array type array int a a array of int 1 2 3 oshibka kompilyacii v makros array of peredano 4 argumenta no on prinimaet lish 2 Makroopredeleniya chasto ispolzuyutsya dlya obespecheniya sovmestimosti s raznymi versiyami bibliotek u kotoryh izmenilsya API vklyuchaya te ili inye uchastki koda v zavisimosti ot versii biblioteki Dlya etih celej biblioteki chasto predostavlyayut makroopredeleniya s opisaniem svoej versii a inogda i makrosy s parametrami dlya sravneniya tekushej versii s zadannoj v ramkah preprocessora Takzhe makroopredeleniya primenyayutsya dlya uslovnoj kompilyacii otdelnyh kuskov programmy naprimer dlya vklyucheniya podderzhki kakogo libo dopolnitelnogo funkcionala Makroopredeleniya s parametrami shiroko ispolzuyutsya v Si programmah dlya sozdaniya analogov obobshyonnyh funkcij Ranee oni takzhe primenyalis dlya realizacii vstraivaemyh funkcij no nachinaya so standarta S99 eta neobhodimost ischezla blagodarya dobavleniyu inline funkcij Odnako v svyazi s tem chto makroopredeleniya s parametrami funkciyami ne yavlyayutsya no vyzyvayutsya analogichnym obrazom po oshibke programmista mogut voznikat neozhidannye problemy vklyuchaya otrabotku tolko chasti koda iz makroopredeleniya i nepravilnye prioritety vypolneniya operacij V kachestve primera oshibochnogo koda mozhno privesti makros vozvedeniya chisla v kvadrat include lt stdio h gt int main void define SQR x x x printf d SQR 5 vsyo verno 5 5 25 printf d SQR 5 0 predpolagalos 25 no budet vyvedeno 5 5 0 5 0 printf d SQR 4 3 vsyo verno 1 t k 4 3 1 1 4 4 4 3 1 printf d SQR 5 2 predpolagalos 4 2 2 no budet vyvedeno 5 5 2 5 2 return 0 V privedyonnom vyshe primere oshibkoj yavlyaetsya to chto soderzhimoe argumenta makrosa podstavlyaetsya v tekst kak est bez uchyota prioritetov operacij V takih sluchayah neobhodimo ispolzovat inline funkcii libo yavno rasstavlyat prioritety operacij v vyrazheniyah ispolzuyushih parametry makrosa s pomoshyu kruglyh skobok include lt stdio h gt int main void define SQR x x x printf d SQR 4 1 verno 25 return 0 Programmirovanie na SiStruktura programmy Moduli Programma predstavlyaet soboj nabor fajlov s kodom na yazyke Si kotorye mogut kompilirovatsya v obektnye fajly Obektnye fajly zatem prohodyat etap komponovki drug s drugom a takzhe so vneshnimi bibliotekami v rezultate chego poluchaetsya itogovyj ispolnyaemyj fajl ili biblioteka Svyaz fajlov drug s drugom ravno kak i s bibliotekami trebuet opisaniya prototipov ispolzuemyh funkcij vneshnih peremennyh i neobhodimyh tipov dannyh v kazhdom fajle Takie dannye prinyato vynosit v otdelnye zagolovochnye fajly kotorye podklyuchayutsya s pomoshyu direktivy include v teh fajlah gde trebuetsya ta ili inaya funkcionalnost i pozvolyayut organizovyvat sistemu pohozhuyu na sistemu modulej Modulem v takom sluchae mozhet vystupat nabor otdelnyh fajlov s ishodnym kodom dlya kotoryh predstavlen interfejs v vide zagolovochnyh fajlov obektnaya biblioteka ili eyo chast s sootvetstvuyushimi zagolovochnymi fajlami samodostatochnyj nabor iz odnogo ili bolee zagolovochnyh fajlov interfejsnaya biblioteka staticheskaya biblioteka ili eyo chast s sootvetstvuyushimi zagolovochnymi fajlami dinamicheskaya biblioteka ili eyo chast s sootvetstvuyushimi zagolovochnymi fajlami Poskolku direktiva include lish podstavlyaet tekst drugogo fajla na etape preprocessora mnogokratnoe podklyuchenie odnogo i togo zhe fajla mozhet privodit k oshibkam etapa kompilyacii Poetomu v takih fajlah ispolzuetsya zashita ot povtornogo vklyucheniya s pomoshyu makrokomand define i ifndef Fajly ishodnogo koda Tekst fajla ishodnogo koda na yazyke Si sostoit iz nabora globalnyh opredelenij dannyh tipov i funkcij Globalnye peremennye i funkcii obyavlennye so specifikatorami static i inline dostupny tolko v predelah togo fajla v kotorom oni obyavleny libo pri vklyuchenii odnogo fajla v drugoj cherez direktivu include Pri etom funkcii i peremennye obyavlennye v zagolovochnom fajle so slovom static budut sozdavatsya zanovo pri kazhdom podklyuchenii zagolovochnogo fajla k ocherednomu fajlu s ishodnym kodom Globalnye peremennye i prototipy funkcii obyavlennye so specifikatorom extern schitayutsya podklyuchaemymi iz drugih fajlov To est ih dopuskaetsya ispolzovat v sootvetstvii s opisaniem predpolagaetsya chto posle sborki programmy oni budut svyazany komponovshikom s originalnymi obektami i funkciyami opisannymi v svoih fajlah Globalnye peremennye i funkcii krome static i inline mogut byt dostupny iz drugih fajlov pri uslovii ih nadlezhashego obyavleniya tam so specifikatorom extern Peremennye i funkcii obyavlennye s modifikatorom static takzhe mogut byt dostupny v drugih fajlah no lish pri peredache ih adresa po ukazatelyu Obyavleniya tipov typedef struct i union ne mogut importirovatsya v drugih fajlah Pri neobhodimosti ispolzovaniya v drugih fajlah oni dolzhny byt tam produblirovany libo vyneseny v otdelnyj zagolovochnyj fajl To zhe samoe otnositsya i k inline funkciyam Tochka vhoda programmy Dlya ispolnyaemoj programmy standartnoj tochkoj vhoda yavlyaetsya funkciya s imenem main kotoraya ne mozhet byt staticheskoj i dolzhna byt edinstvennoj v programme Ispolnenie programmy nachinaetsya s pervogo operatora funkcii main i prodolzhaetsya do vyhoda iz neyo posle chego programma zavershaetsya i vozvrashaet operacionnoj sisteme abstraktnyj celochislennyj kod rezultata svoej raboty Dopustimye prototipy funkcii main Bez argumentov S argumentami komandnoj strokiint main void int main int argc char argv V peremennuyu argc pri vyzove peredayotsya kolichestvo argumentov peredannyh programme vklyuchaya i put k samoj programme poetomu obychno peremennaya argc soderzhit znachenie ne menshee chem 1 V peremennuyu argv peredayotsya sama stroka zapuska programmy v vide massiva tekstovyh strok poslednim elementom kotorogo yavlyaetsya NULL Kompilyator garantiruet chto na moment zapuska funkcii main vse globalnye peremennye v programme budut inicializirovany V kachestve rezultata funkciya main mozhet vernut lyuboe celoe chislo v diapazone znachenij tipa int kotoroe budet peredano operacionnoj sisteme ili drugomu okruzheniyu v kachestve koda vozvrata programmy Standart yazyka ne opredelyaet smysla kodov vozvrata Obychno operacionnaya sistema gde rabotayut programmy imeet te ili inye sredstva pozvolyayushie poluchit znachenie koda vozvrata i proanalizirovat ego Inogda sushestvuyut opredelyonnye soglasheniya o znacheniyah etih kodov Obshim yavlyaetsya soglashenie o tom chto nulevoe znachenie koda vozvrata signaliziruet ob uspeshnom zavershenii programmy a nenulevoe predstavlyaet soboj kod voznikshej oshibki Zagolovochnyj fajl a href wiki Stdlib h title Stdlib h stdlib h a opredelyaet dva obshih makroopredeleniya EXIT SUCCESS i EXIT FAILURE kotorye sootvetstvuyut uspeshnomu i neuspeshnomu zaversheniyu raboty programmy Kody vozvrata takzhe mogut ispolzovatsya v ramkah prilozhenij vklyuchayushih v sebya mnozhestvo processov dlya obespecheniya vzaimodejstviya mezhdu etimi processami v sluchae chego prilozhenie samo opredelyaet smyslovoe znachenie dlya kazhdogo koda vozvrata Rabota s pamyatyu Model pamyati V Si predusmotreno 4 sposoba vydeleniya pamyati kotorye opredelyayut vremya zhizni peremennoj i moment eyo inicializacii Sposoby vydeleniya pamyati Sposob vydeleniya Celevye obekty Vremya vydeleniya Vremya osvobozhdeniya Nakladnye rashodyStaticheskoe vydelenie pamyati Globalnye peremennye i peremennye pomechennye klyuchevym slovom static no bez Thread local Pri starte programmy Po zavershenii raboty programmy OtsutstvuyutVydelenie pamyati na urovne potoka Peremennye pomechennye klyuchevym slovom Thread local Pri starte potoka Po zavershenii potoka Pri sozdanii potokaAvtomaticheskoe vydelenie pamyati Argumenty funkcij i vozvrashaemye imi znacheniya lokalnye peremennye funkcij v tom chisle registry i massivy peremennoj dliny Pri vyzove funkcij na urovne steka Avtomaticheski po zavershenii funkcij Neznachitelny poskolku izmenyaetsya lish ukazatel na vershinu stekaDinamicheskoe vydelenie pamyati Pamyat vydelyaemaya cherez funkcii malloc calloc i realloc Vruchnuyu iz kuchi v moment vyzova ispolzuemoj funkcii Vruchnuyu s pomoshyu funkcii free Bolshie kak na vydelenie tak i na osvobozhdenie Vse eti sposoby hraneniya dannyh prigodny v razlichnyh situaciyah i imeyut svoi preimushestva i nedostatki Globalnye peremennye ne pozvolyayut pisat reenterabelnye algoritmy a avtomaticheskoe vydelenie pamyati ne pozvolyaet vozvrashat proizvolnuyu oblast pamyati iz vyzova funkcii Avtomaticheskoe vydelenie takzhe ne podhodit dlya vydeleniya bolshih obyomov pamyati poskolku mozhet privesti k porche steka ili kuchi Dinamicheskaya pamyat lishena etih nedostatkov no imeet bolshie nakladnye rashody pri eyo ispolzovanii i bolee slozhna v ispolzovanii Tam gde eto vozmozhno predpochtitelnym yavlyaetsya avtomaticheskoe ili staticheskoe vydelenie pamyati takoj sposob hraneniya obektov upravlyaetsya kompilyatorom chto osvobozhdaet programmista ot trudnostej ruchnogo vydeleniya i osvobozhdeniya pamyati kak pravilo sluzhashego istochnikom trudno otyskivaemyh oshibok utechek pamyati oshibok segmentirovaniya i povtornogo osvobozhdeniya v programme K sozhaleniyu mnogie struktury dannyh imeyut peremennyj razmer vo vremya vypolneniya programmy poetomu iz za togo chto avtomaticheski i staticheski vydelennye oblasti dolzhny imet izvestnyj fiksirovannyj razmer vo vremya kompilyacii ochen chasto trebuetsya ispolzovat dinamicheskoe vydelenie Dlya avtomaticheski vydelyaemyh peremennyh s pomoshyu modifikatora register mozhno davat podskazku kompilyatoru o neobhodimosti bystrogo dostupa k nim Takie peremennye mogut pomeshatsya v registry processora Iz za ogranichennogo kolichestva registrov i vozmozhnyh optimizacij kompilyatora peremennye mogut okazatsya v obychnoj pamyati no tem ne menee iz programmy na nih nevozmozhno budet poluchit ukazatel Modifikator register yavlyaetsya edinstvennym kotoryj mozhno ukazyvat v argumentah funkcij Adresaciya pamyati Yazyk Si unasledoval linejnuyu adresaciyu pamyati pri rabote so strukturami massivami i vydelennymi oblastyami pamyati Standart yazyka takzhe dopuskaet vypolnenie operacij sravneniya nad nulevym ukazatelem i nad adresami v ramkah massivov struktur i vydelennyh oblastej pamyati Takzhe dopuskaetsya rabota s adresom elementa massiva sleduyushim za poslednim chto sdelano dlya oblegcheniya napisaniya algoritmov Odnako sravnenie ukazatelej adresov poluchennyh dlya raznyh peremennyh ili oblastej pamyati ne dolzhno osushestvlyatsya tak kak rezultat budet zaviset ot realizacii konkretnogo kompilyatora Predstavlenie v pamyati Predstavlenie pamyati programmy zavisit ot apparatnoj arhitektury ot operacionnoj sistemy i ot kompilyatora Tak naprimer na bolshinstve arhitektur stek rastyot vniz no sushestvuyut arhitektury gde stek rastyot vverh Granica mezhdu stekom i kuchej mozhet byt chastichno zashishena ot perepolneniya steka specialnoj oblastyu pamyati A raspolozhenie dannyh i koda bibliotek mozhet zaviset ot parametrov kompilyacii Standart Si abstragiruetsya nad realizaciej i pozvolyaet pisat perenosimyj kod odnako ponimanie ustrojstva pamyati processa pomogaet v otladke i napisanii bezopasnyh i otkazoustojchivyh prilozhenij Tipovoe predstavlenie pamyati processa v Unix podobnyh OS Tipovoe predstavlenie virtualnoj pamyati processa v Unix podobnyh OS Pri zapuske programmy iz ispolnyaemogo fajla v operativnuyu pamyat importiruyutsya instrukcii processora mashinnyj kod i inicializirovannye dannye V to zhe vremya v starshie adresa importiruyutsya argumenty komandnoj stroki dostupnye v funkcii main so sleduyushej signaturoj vo vtorom argumente int argc char argv i peremennye okruzheniya Oblast neinicializirovannyh dannyh soderzhit globalnye peremennye v tom chisle obyavlennye kak static kotorye ne byli proinicializirovany v programmnom kode Takie peremennye po umolchaniyu inicializiruyutsya nulyami posle starta programmy Oblast inicializirovannyh dannyh segment dannyh tozhe soderzhit globalnye peremennye no v etu oblast popadayut te peremennye kotorym bylo zadano nachalnoe znachenie Neizmenyaemye dannye vklyuchayushie v sebya peremennye obyavlennye s modifikatorom const strokovye literaly i drugie sostavnye literaly pomeshayutsya v segment teksta programmy Segment teksta programmy soderzhit takzhe ispolnyaemyj kod i dostupen tolko na chtenie poetomu popytka izmeneniya dannyh iz etogo segmenta privedyot k neopredelyonnomu povedeniyu v vide oshibki segmentacii Oblast steka prednaznachena dlya razmesheniya dannyh svyazannyh s vyzovom funkcij i lokalnyh peremennyh Pered kazhdym zapuskom funkcii stek uvelichivaetsya dlya razmesheniya v nyom argumentov peredavaemyh v funkciyu V hode svoej raboty funkciya mozhet razmeshat v steke lokalnye peremennye i vydelyat v nyom pamyat pod massivy peremennoj dliny a nekotorye kompilyatory predostavlyayut takzhe sredstva vydeleniya pamyati v ramkah steka posredstvom vyzova alloca kotoryj ne vhodit v standart yazyka Posle zaversheniya raboty funkcii stek umenshaetsya do togo znacheniya kotoroe bylo pered vyzovom odnako etogo mozhet ne proishodit pri nekorrektnoj rabote so stekom Pamyat vydelennaya dinamicheski predostavlyaetsya iz kuchi Nemalovazhnoj detalyu yavlyaetsya nalichie sluchajnogo otstupa mezhdu stekom i verhnej oblastyu a takzhe mezhdu oblastyu inicializirovannyh dannyh i kuchej Delaetsya eto v celyah bezopasnosti naprimer dlya predotvrasheniya vstraivaniya v stek drugih funkcij Dinamicheski podklyuchaemye biblioteki i otobrazheniya fajlov s fajlovoj sistemy nahodyatsya mezhdu stekom i kuchej Obrabotka oshibok V Si otsutstvuyut kakie libo vstroennye mehanizmy kontrolya oshibok no sushestvuet neskolko obsheprinyatyh sposobov ih obrabotki sredstvami yazyka V obshem vide praktika obrabotki oshibok yazyka Si v otkazoustojchivom kode vynuzhdaet pisat gromozdkie chasto povtoryayushiesya konstrukcii v kotoryh algoritm sovmeshyon s obrabotkoj oshibok Markery oshibok i errno V yazyke Si aktivno ispolzuetsya specialnaya peremennaya errno iz zagolovochnogo fajla a href wiki Errno h title Errno h errno h a v kotoruyu funkcii zanosyat kod oshibki vozvrashaya pri etom znachenie yavlyayusheesya markerom oshibki Dlya proverki rezultata na oshibki rezultat sravnivayut s markerom oshibki i esli oni sovpadayut to mozhno proanalizirovat kod oshibki sohranyonnyj v errno dlya korrektirovki raboty programmy ili vyvoda otladochnogo soobsheniya V standartnoj biblioteke standart zachastuyu lish opredelyaet vozvrashaemye markery oshibok a vystavlenie errno zavisit ot konkretnoj realizacii V kachestve markerov oshibok obychno vystupayut sleduyushie znacheniya 1 dlya tipa int v sluchayah kogda otricatelnyj diapazon rezultata ne ispolzuetsya 1 dlya tipa ssize t POSIX size t 1 dlya tipa size t time t 1 pri ispolzovanii nekotoryh funkcij dlya raboty so vremenem NULL dlya ukazatelej EOF pri potokovoj rabote s fajlami nenulevoj kod oshibki Praktika vozvrasheniya markera oshibki vmesto koda oshibki hot i ekonomit kolichestvo peredavaemyh v funkcii argumentov no v ryade sluchaev privodit k oshibkam v rezultate chelovecheskogo faktora Naprimer programmistami chasto ignoriruetsya proverka rezultata tipa ssize t a sam rezultat ispolzuetsya dalshe v vychisleniyah chto privodit k trudno ulovimym oshibkam esli vozvrashaetsya 1 Eshyo silnee sposobstvuet poyavleniyu oshibok vozvrat v kachestve markera oshibki korrektnogo znacheniya chto takzhe vynuzhdaet programmista delat bolshe proverok a sootvetstvenno i pisat bolshe odnotipnogo povtoryayushegosya koda Takoj podhod praktikuetsya v potokovyh funkciyah rabotayushih s obektami tipa FILE markerom oshibki yavlyaetsya znachenie EOF odnovremenno yavlyayas i markerom konca fajla Poetomu po EOF inogda prihoditsya proveryat potok simvolov kak na konec fajla s pomoshyu funkcii feof tak i nalichie oshibki s pomoshyu ferror Pri etom nekotorye funkcii kotorye mogut vernut EOF po standartu ne obyazany vystavlyat errno Otsutstvie edinoj praktiki obrabotki oshibok v standartnoj biblioteke privodit k poyavleniyu sobstvennyh sposobov obrabotki oshibok i kombinirovaniyu chasto ispolzuemyh sposobov v storonnih proektah Naprimer v proekte systemd sovmestili idei vozvrasheniya koda oshibki i chisla 1 v kachestve markera vozvrashaetsya otricatelnyj kod oshibki A v biblioteke GLib vveli v praktiku vozvrashenie v kachestve markera oshibki znachenie buleva tipa v to vremya kak podrobnaya informaciya ob oshibke pomeshaetsya v specialnuyu strukturu ukazatel na kotoruyu vozvrashaetsya cherez poslednij argument funkcii Shozhee reshenie ispolzuet proekt Enlightenment v kotorom v kachestve markera tozhe ispolzuetsya bulev tip no informaciya ob oshibke vozvrashaetsya po analogii so standartnoj bibliotekoj cherez otdelnuyu funkciyu kotoruyu neobhodimo proveryat esli byl vozvrashyon marker Vozvrat koda oshibki Alternativoj markeram oshibok yavlyaetsya vozvrashenie koda oshibki napryamuyu a rezultata raboty funkcii cherez argumenty po ukazatelyu Po takomu puti poshli razrabotchiki standarta POSIX v funkciyah kotorogo prinyato vozvrashat kod oshibki v vide chisla tipa int Odnako vozvrashenie znacheniya tipa int yavno ne dayot ponyat chto vozvrashaetsya imenno kod oshibki a ne marker chto mozhet vesti k oshibkam esli rezultat takih funkcij budet proveryatsya na znachenie 1 V rasshirenii K standarta C11 predstavlen specialnyj tip errno t dlya hraneniya koda oshibki Sushestvuyut rekomendacii ispolzovat imenno etot tip v polzovatelskom kode dlya vozvrasheniya oshibok a esli on ne predostavlen standartnoj bibliotekoj to obyavlyat ego samostoyatelno ifndef STDC LIB EXT1 typedef int errno t endif Takoj podhod pomimo povysheniya kachestva koda izbavlyaet ot neobhodimosti ispolzovaniya errno chto pozvolyaet delat biblioteki s reenterabelnymi funkciyami bez neobhodimosti podklyucheniya dopolnitelnyh bibliotek takih kak POSIX Threads dlya pravilnogo opredeleniya errno Oshibki v matematicheskih funkciyah Bolee slozhnoj yavlyaetsya obrabotka oshibok v matematicheskih funkciyah iz zagolovochnogo fajla a href wiki Math h title Math h math h a v kotoryh mogut voznikat 3 tipa oshibok vyhod za predely diapazona vhodnyh znachenij poluchenie beskonechnogo rezultata dlya konechnyh vhodnyh dannyh vyhod rezultata za predely diapazona ispolzuemogo tipa dannyh Predotvrashenie dvuh iz tryoh tipov oshibok svoditsya k proverkam vhodnyh dannyh na oblast dopustimyh znachenij Odnako predskazat vyhod rezultata za predely tipa krajne slozhno Poetomu standartom yazyka predusmotrena vozmozhnost analiza matematicheskih funkcij na oshibki Nachinaya so standarta C99 takoj analiz vozmozhen dvumya sposobami v zavisimosti ot znacheniya hranimogo v makrose math errhandling Esli vystavlen bit MATH ERRNO to peremennuyu errno neobhodimo predvaritelno sbrosit v 0 a posle vyzova matematicheskoj funkcii proverit na oshibki EDOM i ERANGE Esli vystavlen bit MATH ERREXCEPT to vozmozhnye matematicheskie oshibki predvaritelno sbrasyvayutsya funkciej feclearexcept iz zagolovochnogo fajla a href wiki Fenv h title Fenv h fenv h a a posle vyzova matematicheskoj funkcii testiruyutsya s pomoshyu funkcii fetestexcept Pri etom sposob obrabotki oshibok opredelyaetsya konkretnoj realizaciej standartnoj biblioteki i mozhet otsutstvovat sovsem Poetomu v platformonezavisimom kode mozhet potrebovatsya proverka rezultata srazu dvumya sposobami v zavisimosti ot znacheniya math errhandling Osvobozhdenie resursov Kak pravilo vozniknovenie oshibki trebuet zaversheniya raboty funkcii s vozvrasheniem indikatora oshibki Esli v funkcii oshibka mozhet vozniknut v raznyh eyo chastyah trebuetsya osvobozhdat resursy vydelennye v hode eyo raboty chtoby predotvratit utechki Horoshej praktikoj osvobozhdeniya resursov schitaetsya ih chistka v obratnom poryadke pered vozvratom iz funkcii a v sluchae oshibok osvobozhdenie v obratnom poryadke posle osnovnogo return V otdelnye chasti takogo osvobozhdeniya mozhno sdelat perehod s pomoshyu operatora goto Podobnyj podhod pozvolyaet vynesti ne svyazannye s realizuemym algoritmom uchastki koda za predely samogo algoritma povyshaya chitabelnost koda i shozh s rabotoj operatora defer iz yazyka programmirovaniya Go Primer osvobozhdeniya resursov privedyon nizhe v razdele primerov Dlya osvobozhdeniya resursov v ramkah programmy predusmotren mehanizm obrabotchikov vyhoda iz programmy Obrabotchiki naznachayutsya s pomoshyu funkcii atexit i ispolnyayutsya kak po zavershenii funkcii main cherez operator return tak i po ispolneniyu funkcii exit Pri etom obrabotchiki ne ispolnyayutsya po funkciyam abort i Exit V kachestve primera osvobozhdeniya resursov po zavershenii programmy mozhno privesti osvobozhdenie pamyati vydelennoj pod globalnye peremennye Nesmotrya na to chto pamyat tak ili inache osvobozhdaetsya po zavershenii raboty programmy operacionnoj sistemoj i dopuskaetsya ne osvobozhdat tu pamyat kotoraya trebuetsya na protyazhenii vsej raboty programmy yavnoe osvobozhdenie predpochtitelnee tak kak oblegchaet poisk utechek pamyati storonnimi sredstvami i umenshaet shans na vozniknovenie utechek pamyati v rezultate oshibki Kod primera programmy s osvobozhdeniem resursov include lt stdio h gt include lt stdlib h gt int numbers count int numbers void free numbers void free numbers int main int argc char argv if argc lt 2 exit EXIT FAILURE numbers count atoi argv 1 if numbers count lt 0 exit EXIT FAILURE numbers calloc numbers count sizeof numbers if numbers perror Oshibka vydeleniya pamyati pod massiv exit EXIT FAILURE atexit free numbers rabota s massivom numbers Zdes budet avtomaticheski vyzvan obrabotchik free numbers return EXIT SUCCESS Nedostatkom dannogo podhoda yavlyaetsya to chto format naznachaemyh obrabotchikov ne predusmatrivaet peredachu proizvolnyh dannyh v funkciyu chto pozvolyaet sozdavat obrabotchiki tolko dlya globalnyh peremennyh Primery programm na Si Minimalnaya programma na Si Minimalnaya programma na Si ne trebuyushaya obrabotki argumentov imeet sleduyushij vid int main void Dopuskaetsya ne pisat operator return u funkcii main V takom sluchae soglasno standartu funkciya main vozvrashaet 0 ispolnyaya vse obrabotchiki naznachennye na funkciyu exit Pri etom podrazumevaetsya chto programma uspeshno zavershilas Hello world Programma Hello world privedena eshyo v pervom izdanii knigi Yazyk programmirovaniya Si Kernigana i Ritchi include lt stdio h gt int main void Ne prinimaet argumenty printf Hello world n n novaya stroka return 0 Udachnoe zavershenie programmy Eta programma pechataet soobshenie Hello world na standartnom ustrojstve vyvoda Obrabotka oshibok na primere chteniya fajla Mnogie funkcii yazyka Si mogut vernut oshibku ne vypolniv trebuemyh ot nih dejstvij Oshibki trebuetsya proveryat i pravilno na nih reagirovat v tom chisle chasto trebuetsya probrasyvat oshibku iz funkcii na uroven vyshe dlya analiza Pri etom funkciyu v kotoroj proizoshla oshibka mozhno delat reenterabelnoj v takom sluchae po oshibke funkciya ne dolzhna izmenyat vhodnye ili vyhodnye dannye chto pozvolyaet bezopasno perezapuskat eyo posle ispravleniya oshibochnoj situacii V primere realizovana funkciya chteniya fajla na yazyke Si odnako ona trebuet sootvetstviya funkcij fopen i fread standartu POSIX inache oni mogut ne vystavlyat peremennuyu errno chto silno uslozhnyaet kak otladku tak i napisanie universalnogo i bezopasnogo koda Na platformah ne sootvetstvuyushih POSIX povedenie dannoj programmy budet neopredelyonnym v sluchae oshibki Osvobozhdenie resursov po oshibkam nahoditsya za osnovnym algoritmom dlya povysheniya chitabelnosti a perehod osushestvlyaetsya s pomoshyu goto Kod primera programmy chteniya fajla s obrabotkoj oshibok include lt errno h gt include lt stdio h gt include lt stdlib h gt Opredelyaem tip dlya hraneniya koda oshibki esli on ne opredelyon ifndef STDC LIB EXT1 typedef int errno t endif enum EOK 0 znachenie errno t pri uspeshnom zavershenii Funkciya chteniya soderzhimogo fajla errno t get file contents const char filename void contents ptr size t contents size ptr FILE f f fopen filename rb if f V POSIX fopen vystavlyaet errno po oshibke return errno Poluchaem razmer fajla fseek f 0 SEEK END long contents size ftell f if contents size 0 contents ptr NULL contents size ptr 0 goto cleaning fopen rewind f Peremennaya dlya hraneniya vozvrashaemogo koda oshibki errno t saved errno void contents contents malloc contents size if contents saved errno errno goto aborting fopen Chitaem soderzhimoe fajla celikom po ukazatelyu contents size t n n fread contents contents size 1 f if n 0 Ne proveryaem na feof t k buferizirovano posle fseek V POSIX fread vystavlyaet errno po oshibke saved errno errno goto aborting contents Vozvrashaem vydelennuyu pamyat i eyo razmer contents ptr contents contents size ptr contents size Sekciya osvobozhdeniya resursov po uspeshnomu zaversheniyu cleaning fopen fclose f return EOK Otdelnaya sekciya dlya osvobozhdeniya resursov po oshibke aborting contents free contents aborting fopen fclose f return saved errno int main int argc char argv if argc lt 2 return EXIT FAILURE const char filename argv 1 errno t errnum void contents size t contents size errnum get file contents filename amp contents amp contents size if errnum char buf 1024 const char error text strerror r errnum buf sizeof buf fprintf stderr s n error text exit EXIT FAILURE printf s int contents size contents free contents return EXIT SUCCESS Sredstva razrabotki Kompilyatory Nekotorye kompilyatory idut v komplekte s kompilyatorami drugih yazykov programmirovaniya vklyuchaya C ili yavlyayutsya sostavnoj chastyu sredy razrabotki programmnogo obespecheniya GNU Compiler Collection GCC polnostyu podderzhivaet standarty C99 i C17 C11 s ispravleniyami Takzhe podderzhivaet rasshireniya GNU zashitu koda s pomoshyu sanitajzerov i nabor dopolnitelnyh vozmozhnostej v tom chisle atributy Clang takzhe polnostyu podderzhivaet standarty C99 i C17 Razrabatyvaetsya vo mnogom sovmestimym s kompilyatorom GCC v tom chisle podderzhivaet rasshireniya GNU i zashitu koda sanitajzerami BDS C Borland C C Builder DJGPP Intel C compiler LCC Microsoft Visual Studio MinGW Open Watcom Oracle Solaris Studio Pelles C Portable C Compiler Tiny C Compiler Topspeed JPI CRealizacii standartnoj biblioteki Nesmotrya na to chto standartnaya biblioteka vhodit v standart yazyka eyo realizacii idut otdelno ot kompilyatorov Poetomu standarty yazyka podderzhivaemye kompilyatorom i bibliotekoj mogut razlichatsya Otkrytaya biblioteka glibc yavlyaetsya osnovnoj vo mnogih distributivah GNU Linux podderzhivaet standarty C11 i POSIX 1 2008 a takzhe predostavlyaet nabor ispravlenij i dopolnitelnyh vozmozhnostej ot GNU Otkrytaya biblioteka musl zadumyvalas v kachestve bolee legkovesnoj zameny dlya glibc ispolzuetsya kak biblioteka po umolchaniyu v distributive Alpine Linux Void Linux Biblioteka CRT ot Microsoft podderzhivaet standart C99 postavlyaetsya kak komponent v sostave Windows 10 Integrirovannye sredy razrabotki CLion polnostyu podderzhivaet C99 no podderzhka S11 chastichnaya sborka osnovana na CMake Code Blocks svobodnaya krossplatformennaya integrirovannaya sreda razrabotki dlya yazykov Si C D Fortran Podderzhivaet bolee dvuh desyatkov kompilyatorov S kompilyatorom GCC dostupen Si vseh versij ot C90 do C17 Eclipse svobodnaya integrirovannaya sreda razrabotki podderzhivayushaya yazyk Si standarta S99 Imeet modulnuyu arhitekturu chto dayot vozmozhnost podklyucheniya podderzhki raznyh yazykov programmirovaniya i dopolnitelnyh vozmozhnostej Dostupen modul dlya integracii s Git odnako otsutstvuet integraciya s CMake KDevelop svobodnaya integrirovannaya sreda razrabotki podderzhivayushaya nekotorye osobennosti yazyka Si iz standarta C11 Pozvolyaet upravlyat proektami ispolzuyushimi raznye yazyki programmirovaniya vklyuchaya C i Python podderzhivaet sistemu sborki CMake Imeet vstroennuyu podderzhku Git na urovne raboty s fajlami i nastraivaemoe formatirovanie ishodnogo koda dlya raznyh yazykov Microsoft Visual Studio lish chastichno podderzhivaet standarty C99 i C11 poskolku orientiruetsya na razrabotku pod C odnako imeet vstroennuyu podderzhku CMake Sredstva modulnogo testirovaniya Poskolku yazyk Si ne predostavlyaet sredstv dlya bezopasnogo napisaniya koda a mnogie elementy yazyka sposobstvuyut poyavleniyu oshibok napisanie kachestvennogo i otkazoustojchivogo koda mozhno garantirovat tolko s pomoshyu sozdaniya avtomatizirovannyh testov Dlya uprosheniya takogo testirovaniya sushestvuyut razlichnye realizacii storonnih bibliotek modulnogo testirovaniya Biblioteka Check predostavlyaet frejmvork dlya testirovaniya programmnogo koda na yazyke Si v obsheprinyatom stile xUnit Sredi vozmozhnostej mozhno upomyanut zapusk testov v otdelnyh processah cherez a href wiki Fork title Fork fork a chto pozvolyaet raspoznavat v testah oshibki segmentirovaniya a takzhe dayot vozmozhnost zadavat maksimalnoe vremya ispolneniya otdelnyh testov Biblioteka Google Test takzhe predostavlyaet testirovanie po principam xUnit no prednaznachena dlya testirovaniya koda na yazyke C chto pozvolyaet eyo ispolzovat dlya testirovaniya koda i na yazyke Si Takzhe podderzhivaet izolirovannoe testirovanie otdelnyh chastej programmy Odnim iz dostoinstv biblioteki yavlyaetsya razdelenie makrosov testirovaniya na utverzhdeniya i oshibki chto mozhet oblegchit otladku koda Sushestvuet takzhe mnogo drugih sistem dlya testirovaniya koda na Si takih kak AceUnit GNU Autounit cUnit i drugih no oni libo ne osushestvlyayut testirovanie v izolirovannyh okruzheniyah libo predostavlyayut malo vozmozhnostej libo perestali razvivatsya Sredstva otladki Po proyavleniyam oshibok ne vsegda mozhno sdelat odnoznachnyj vyvod o problemnom meste v kode odnako lokalizovat problemu chasto pomogayut razlichnye sredstva otladki Gdb interaktivnyj konsolnyj otladchik dlya razlichnyh yazykov v tom chisle i dlya Si Valgrind yavlyaetsya sredstvom dinamicheskogo analiza koda mozhet vyyavlyat oshibki v kode neposredstvenno vo vremya vypolneniya programmy Podderzhivaet vyyavlenie utechek obrashenij v neinicializirovannuyu pamyat obrashenij po nevernym adresam v tom chisle perepolnenie bufera Takzhe podderzhivaet ispolnenie v rezhime profilirovaniya s pomoshyu profajlera callgrind graficheskij interfejs dlya vizualizacii rezultatov profilirovaniya poluchennyh s pomoshyu profajlera callgrind Kompilyatory na dinamicheskie yazyki i platformy Inogda v celyah perenosa teh ili inyh bibliotek funkcij i instrumentov napisannyh na Si v inuyu sredu trebuetsya kompilyaciya Si koda na yazyk bolee vysokogo urovnya ili v kod virtualnoj mashiny prednaznachennoj dlya takogo yazyka Sleduyushie proekty prednaznacheny dlya etih celej Emscripten kompilyator iz LLVM bajt koda naprimer poluchennyj iz C v JavaScript angl staroe nazvanie Alchemy kompilyator iz Si C v ActionScript Virtual Machine AVM2 Pozvolyaet ispolzovat Si biblioteki v Flash i Adobe AIR prilozheniyah Clue kompilyator iz ANSI Si v Lua JavaScript Perl Java Common Lisp AMPC kompilyator iz Si v virtualnuyu mashinu Java Dopolnitelnye instrumenty Takzhe dlya Si sushestvuyut i drugie instrumenty oblegchayushie i dopolnyayushie razrabotku vklyuchaya staticheskie analizatory i utility dlya formatirovaniya koda Staticheskij analiz pomogaet vyyavlyat potencialnye oshibki i uyazvimosti A avtomaticheskoe formatirovanie koda uproshaet organizaciyu sovmestnoj raboty v sistemah kontrolya versij minimiziruya konflikty iz za stilevyh pravok Cppcheck staticheskij analizator koda dlya yazykov Si i C s otkrytymi ishodnymi tekstami inogda vydayot lozhnye srabatyvaniya kotorye mozhno podavlyat specialno oformlennymi kommentariyami v kode utilita komandnoj stroki dlya formatirovaniya ishodnogo koda soglasno zadannomu stilyu kotoryj mozhet ukazyvatsya v specialno oformlennom fajle konfiguracii Obladaet mnozhestvom parametrov i neskolkimi vstroennymi stilyami Razrabatyvaetsya v ramkah proekta Clang Utility i GNU Indent takzhe predostavlyayut formatirovanie koda no parametry formatirovaniya zadayutsya v vide opcij komandnoj stroki Oblast primeneniyaThe C Programming Language Yazyk shiroko primenyaetsya pri razrabotke operacionnyh sistem na urovne prikladnogo interfejsa operacionnyh sistem vo vstraivaemyh sistemah a takzhe dlya sozdaniya vysokoproizvoditelnogo ili kriticheskogo v plane obrabotki oshibok koda Odnoj iz prichin shirokogo rasprostraneniya dlya programmirovaniya na nizkom urovne yavlyaetsya vozmozhnost pisat krossplatformennyj kod kotoryj mozhet po raznomu obrabatyvatsya na raznom oborudovanii i na raznyh operacionnyh sistemah Vozmozhnost pisat vysokoproizvoditelnyj kod obespechivaetsya za schyot polnoj svobody dejstvij programmista i otsutstviya strogogo kontrolya so storony kompilyatora Tak naprimer na yazyke Si napisany pervye realizacii yazykov Java Python Perl i PHP Pri etom vo mnogih programmah naibolee trebovatelnye k resursam chasti prinyato pisat na yazyke Si Yadro programmy Mathematica napisano na Si a MATLAB iznachalno napisannyj na Fortrane byl perepisan na Si v 1984 godu Takzhe Si inogda ispolzuetsya kak promezhutochnyj yazyk pri kompilyacii bolee vysokourovnevyh yazykov Naprimer po takomu principu rabotali pervye realizacii yazykov C Objective C i Go kod napisannyj na etih yazykah translirovalsya v promezhutochnoe predstavlenie na yazyke Si Sovremennymi yazykami rabotayushimi po takomu zhe principu yavlyayutsya yazyk Vala i Nim Eshyo odnoj oblastyu primeneniya yazyka Si yavlyayutsya prilozheniya realnogo vremeni kotorye trebovatelny po chasti otzyvchivosti koda i vremeni ego ispolneniya Takie prilozheniya dolzhny nachinat ispolnenie dejstvij v zhyostko ogranichennyh vremennyh ramkah a sami dejstviya dolzhny ukladyvatsya v opredelyonnyj vremennoj promezhutok V chastnosti standart POSIX 1 predostavlyaet nabor funkcij i vozmozhnostej dlya sozdaniya prilozhenij realnogo vremeni odnako podderzhka zhyostkogo realnogo vremeni dolzhna byt takzhe realizovana i so storony operacionnoj sistemy Yazyki potomkiGrafik indeksa TIOBE pokazyvayushij sravnenie populyarnosti razlichnyh yazykov programmirovaniya Yazyk Si byl i ostayotsya odnim iz samyh rasprostranyonnyh yazykov programmirovaniya v techenie bolee chem soroka let Estestvenno chto ego vliyanie mozhno prosledit v toj ili inoj mere vo mnogih bolee pozdnih yazykah Tem ne menee sredi yazykov dostigshih opredelyonnogo rasprostraneniya pryamyh potomkov u Si nemnogo Chast yazykov potomkov nadstraivaet Si dopolnitelnymi sredstvami i mehanizmami dobavlyayushimi podderzhku novyh paradigm programmirovaniya OOP funkcionalnoe programmirovanie obobshyonnoe programmirovanie i pr K takim yazykam otnosyatsya prezhde vsego C i Objective C a oposredovanno ih potomki Swift i D Takzhe izvestny popytki uluchshit Si ispraviv ego naibolee sushestvennye nedostatki no sohraniv ego privlekatelnye cherty Sredi nih mozhno upomyanut issledovatelskij yazyk Cyclone i ego potomok Rust Inogda oba napravleniya razvitiya obedinyayutsya v odnom yazyke primerom mozhet sluzhit Go Otdelno neobhodimo upomyanut o celoj gruppe yazykov kotorye v bolshej ili menshej mere unasledovali bazovyj sintaksis Si ispolzovanie figurnyh skobok v kachestve ogranichitelej blokov koda opisanie peremennyh harakternye formy operatorov for while if switch s parametrami v skobkah kombinirovannye operacii i drugie iz za chego programmy na etih yazykah imeyut harakternyj vneshnij vid associiruyushijsya imenno s Si Eto takie yazyki kak Java JavaScript PHP Perl AWK C V dejstvitelnosti struktura i semantika etih yazykov silno otlichaetsya ot Si i obychno oni prednaznacheny dlya teh sfer primeneniya gde originalnyj Si nikogda ne ispolzovalsya C Yazyk programmirovaniya C byl sozdan iz Si i unasledoval ego sintaksis dopolniv ego novymi konstrukciyami v duhe yazykov Simula 67 Smalltalk Modula 2 Ada Mesa i Clu Osnovnymi dopolneniyami stali podderzhka OOP opisanie klassov mnozhestvennoe nasledovanie polimorfizm osnovannyj na virtualnyh funkciyah i obobshyonnogo programmirovaniya mehanizm shablonov No pomimo etogo v yazyk vneseno mnozhestvo samyh razlichnyh dopolnenij Na dannyj moment C yavlyaetsya odnim iz naibolee rasprostranyonnyh yazykov programmirovaniya v mire i pozicioniruetsya kak yazyk obshego naznacheniya s uklonom v sistemnoe programmirovanie Iznachalno C sohranyal sovmestimost s Si kotoraya byla zayavlena kak odno iz preimushestv novogo yazyka Pervye realizacii C prosto perevodili novye konstrukcii v chistyj Si posle chego kod obrabatyvalsya obychnym Si kompilyatorom Dlya sohraneniya sovmestimosti sozdateli C otkazalis ot isklyucheniya iz nego nekotoryh chasto kritikuemyh osobennostej Si vmesto etogo sozdav novye parallelnye mehanizmy kotorye rekomenduetsya primenyat pri razrabotke novogo koda na C shablony vmesto makroopredelenij yavnoe privedenie tipov vmesto avtomaticheskogo kontejnery standartnoj biblioteki vmesto ruchnogo dinamicheskogo vydeleniya pamyati i tak dalee Odnako v dalnejshem yazyki razvivalis nezavisimo i sejchas Si i C poslednih vypushennyh standartov yavlyayutsya lish chastichno sovmestimymi ne garantiruetsya uspeshnaya kompilyaciya programmy na Si kompilyatorom C a v sluchae uspeha net garantii chto otkompilirovannaya programma budet rabotat pravilno Osobenno nepriyatny nekotorye tonkie semanticheskie razlichiya kotorye mogut privodit k raznomu povedeniyu odnogo i togo zhe koda sintaksicheski korrektnogo dlya oboih yazykov Naprimer simvolnye konstanty simvoly zaklyuchyonnye v odinarnye kavychki imeyut tip int v Si i tip char v C tak chto obyom pamyati zanimaemyj takimi konstantami v raznyh yazykah razlichaetsya Esli programma chuvstvitelna k razmeru simvolnoj konstanty ona budet rabotat po raznomu buduchi otkompilirovana translyatorami Si i C Podobnye razlichiya zatrudnyayut napisanie programm i bibliotek kotorye mogli by normalno kompilirovatsya i rabotat odinakovo i v Si i v C chto konechno zaputyvaet teh kto programmiruet na oboih yazykah Sredi razrabotchikov i polzovatelej kak Si tak i C est storonniki maksimalnogo sokrasheniya razlichij mezhdu yazykami chto obektivno prineslo by oshutimuyu polzu Sushestvuet odnako i protivopolozhnaya tochka zreniya soglasno kotoroj sovmestimost ne osobenno vazhna hot i polezna i usiliya po umensheniyu nesovmestimosti ne dolzhny prepyatstvovat uluchsheniyu kazhdogo yazyka v otdelnosti Objective C Eshyo odnim variantom rasshireniya Si obektnymi sredstvami yavlyaetsya yazyk Objective C sozdannyj v 1983 godu Obektnaya podsistema byla zaimstvovana iz Smalltalk prichyom vse elementy svyazannye s etoj podsistemoj realizovany v sobstvennom sintaksise dostatochno rezko otlichayushemsya ot sintaksisa Si vplot do togo chto v opisanii klassov sintaksis obyavleniya polej protivopolozhen sintaksisu opisaniya peremennyh v Si snachala pishetsya imya polya zatem ego tip V otlichie ot C Objective C yavlyaetsya nadmnozhestvom klassicheskogo Si to est sohranyaet sovmestimost s ishodnym yazykom pravilnaya programma na Si yavlyaetsya pravilnoj programmoj na Objective C Drugim sushestvennym otlichiem ot ideologii C yavlyaetsya to chto Objective C realizuet vzaimodejstvie obektov putyom obmena polnocennymi soobsheniyami togda kak v C realizovana koncepciya otpravka soobsheniya kak vyzov metoda Polnocennaya obrabotka soobshenij yavlyaetsya znachitelno bolee gibkoj k tomu zhe ona estestvennym obrazom sochetaetsya s parallelnymi vychisleniyami Objective C a takzhe ego pryamoj potomok Swift yavlyayutsya odnimi iz samyh populyarnyh na platformah podderzhivaemyh Apple Problemy i kritikaYazyk Si unikalen s toj tochki zreniya chto imenno on stal pervym yazykom vysokogo urovnya vseryoz potesnivshim assembler v razrabotke sistemnogo programmnogo obespecheniya On ostayotsya yazykom realizovannym na maksimalnom kolichestve apparatnyh platform i odnim iz samyh populyarnyh yazykov programmirovaniya osobenno v mire svobodnogo programmnogo obespecheniya Tem ne menee yazyk imeet mnozhestvo nedostatkov on s momenta poyavleniya podvergaetsya kritike mnogih specialistov Obshaya kritika Yazyk vesma slozhen i napolnen opasnymi elementami kotorye ochen legko ispolzovat nepravilno Svoej strukturoj i pravilami on nikak ne podderzhivaet programmirovanie nacelennoe na sozdanie nadyozhnogo i udobnogo v soprovozhdenii programmnogo koda naprotiv rozhdyonnyj v epohu pryamogo programmirovaniya pod razlichnye processory yazyk sposobstvuet napisaniyu nebezopasnogo i zaputannogo koda Mnogie professionalnye programmisty sklonny schitat chto yazyk Si moshnyj instrument dlya sozdaniya elegantnyh programm no v to zhe vremya s ego pomoshyu mozhno sozdavat krajne nekachestvennye resheniya Iz za razlichnyh dopushenij v yazyke programmy mogut kompilirovatsya so mnozhestvennymi oshibkami chto chasto privodit k nepredskazuemomu povedeniyu programmy Sovremennye kompilyatory predostavlyayut opcii dlya staticheskogo analiza koda no dazhe oni ne sposobny vyyavit vse vozmozhnye oshibki Rezultatom negramotnogo programmirovaniya na Si mogut stat uyazvimosti programmnogo obespecheniya chto mozhet skazatsya na bezopasnosti ego ispolzovaniya U Si vysokij porog vhozhdeniya Specifikaciya ego zanimaet bolee 500 stranic teksta kotorye neobhodimo izuchit polnostyu tak kak dlya sozdaniya bezoshibochnogo i kachestvennogo koda prihoditsya uchityvat mnogie neochevidnye osobennosti yazyka Naprimer avtomaticheskoe privedenie operandov celochislennyh vyrazhenij k tipu int mozhet davat trudno predskazuemye rezultaty pri ispolzovanii binarnyh operatorov unsigned char x 0xFF unsigned char y x 0x1 gt gt 1 Intuitivno zdes ozhidaetsya 0x00 printf y 0x hhX n y Budet vyvedeno 0x80 esli sizeof int gt sizeof char Nedostatochnoe ponimanie podobnyh nyuansov mozhet privodit k poyavleniyu mnogochislennyh oshibok i uyazvimostej Eshyo odnim faktorom uvelichivayushim slozhnost osvoeniya Si yavlyaetsya otsutstvie obratnoj svyazi ot kompilyatora yazyk dayot programmistu polnuyu svobodu dejstvij i pozvolyaet kompilirovat programmy s yavnymi logicheskimi oshibkami Vsyo eto zatrudnyaet ispolzovanie Si v obuchenii v kachestve pervogo yazyka programmirovaniya Nakonec za bolee chem 40 let sushestvovaniya yazyk uspel neskolko ustaret i v nyom dostatochno problematichno ispolzovat mnogie sovremennye priyomy i paradigmy programmirovaniya Nedostatki otdelnyh elementov yazyka Primitivnaya podderzhka modulnosti V sintaksise Si net modulej i mehanizmov ih vzaimodejstviya Fajly ishodnogo koda kompiliruyutsya razdelno i dolzhny vklyuchat prototipy importiruemyh iz drugih fajlov peremennyh funkcij i tipov dannyh Dlya etogo ispolzuetsya vklyuchenie zagolovochnyh fajlov cherez makropodstanovku include V sluchae narusheniya sootvetstviya mezhdu fajlami koda i zagolovochnymi fajlami mogut voznikat kak oshibki etapa komponovki tak i vsevozmozhnye oshibki vremeni ispolneniya ot porchi steka i kuchi do oshibok segmentirovaniya Poskolku direktiva include lish podstavlyaet tekst odnogo fajla v drugoj vklyuchenie bolshogo kolichestva zagolovochnyh fajlov privodit k tomu chto mnogokratno vozrastaet fakticheskij obyom koda popadayushego na kompilyaciyu chto yavlyaetsya prichinoj otnositelno nizkoj skorosti raboty kompilyatorov yazyka Si Neobhodimost soglasovaniya opisanij v osnovnom module i zagolovochnyh fajlah zatrudnyaet soprovozhdenie programmy Preduprezhdeniya vmesto oshibok Standart yazyka dayot programmistu bolshuyu svobodu dejstvij i tem samym vysokie shansy na dopushenie oshibok Mnogoe iz togo chto chashe vsego nelzya delat dozvoleno yazykom i kompilyator v luchshem sluchae vydayot preduprezhdeniya Hotya sovremennye kompilyatory pozvolyayut perevodit vse preduprezhdeniya v klass oshibok eta vozmozhnost ispolzuetsya redko gorazdo chashe preduprezhdeniya ignoriruyutsya esli programma rabotaet udovletvoritelno Tak naprimer do standarta C99 vyzov funkcii a href wiki Malloc class mw redirect title Malloc malloc a bez podklyucheniya zagolovochnogo fajla stdlib h mog privesti k porche steka poskolku v otsutstvie prototipa funkciya vyzyvalas kak vozvrashayushaya tip int togda kak fakticheski ona vozvrashala tip void oshibka voznikala kogda razmery tipov na celevoj platforme razlichalis No dazhe pri etom vydavalos vsego lish preduprezhdenie Otsutstvie kontrolya inicializacii peremennyh Avtomaticheski i dinamicheski sozdavaemye obekty po umolchaniyu ne inicializiruyutsya i posle sozdaniya soderzhat znacheniya ostavshiesya v pamyati ot ranee nahodivshihsya tam obektov Takoe znachenie polnostyu nepredskazuemo ono menyaetsya ot odnoj mashiny k drugoj ot zapuska k zapusku ot vyzova funkcii k vyzovu Esli programma iz za sluchajnogo propuska inicializacii ispolzuet takoe znachenie to rezultat budet nepredskazuemym i mozhet proyavitsya ne srazu Sovremennye kompilyatory pytayutsya diagnostirovat etu problemu staticheskim analizom ishodnogo koda hotya v obshem sluchae staticheskim analizom dannuyu problemu reshit krajne slozhno Dlya vyyavleniya dannyh problem na etape testirovaniya v hode ispolneniya programmy mogut ispolzovatsya dopolnitelnye instrumenty Valgrind i Otsutstvie kontrolya nad adresnoj arifmetikoj Istochnikom opasnyh situacij sluzhit sovmestimost ukazatelej s chislovymi tipami i vozmozhnost ispolzovaniya adresnoj arifmetiki bez strogogo kontrolya na etapah kompilyacii i ispolneniya Eto dayot vozmozhnost poluchit ukazatel na lyuboj obekt vklyuchaya ispolnyaemyj kod i obratitsya po etomu ukazatelyu esli tolko mehanizm zashity pamyati sistemy etomu ne vosprepyatstvuet Nepravilnoe ispolzovanie ukazatelej mozhet porozhdat neopredelyonnoe povedenie programmy i privodit k seryoznym posledstviyam K primeru ukazatel mozhet byt neinicializirovannym ili v rezultate nevernyh arifmeticheskih operacij ukazyvat v proizvolnoe mesto pamyati Na odnih platformah rabota s takim ukazatelem mozhet vyzvat prinuditelnuyu ostanovku programmy na drugih eto mozhet privesti k porche proizvolnyh dannyh v pamyati poslednyaya oshibka opasna tem chto eyo posledstviya nepredskazuemy i mogut proyavitsya v proizvolnyj moment vremeni v tom chisle namnogo pozzhe momenta sobstvenno oshibochnogo dejstviya Dostup k massivam v Si takzhe realizovan posredstvom adresnoj arifmetiki i ne predpolagaet sredstv proverki korrektnosti obrasheniya k elementam massiva po indeksu Naprimer vyrazheniya a i i i a identichny i prosto transliruyutsya k vidu a i a proverka na vyhod za granicy massiva ne provoditsya Obrashenie po indeksu prevyshayushemu verhnyuyu granicu massiva privodit k obrasheniyu k dannym razmeshyonnym v pamyati posle massiva chto nazyvayut perepolneniem bufera Kogda podobnoe obrashenie proishodit oshibochno ono mozhet privesti k nepredskazuemomu povedeniyu programmy Neredko dannaya osobennost ispolzuetsya v eksploitah ispolzuemyh dlya nelegalnogo dostupa k pamyati drugogo prilozheniya ili pamyati yadra operacionnoj sistemy Pobuzhdayushaya k oshibkam dinamicheskaya pamyat Sistemnye funkcii dlya raboty s dinamicheski vydelyaemoj pamyatyu ne obespechivayut kontrolya za pravilnostyu i svoevremennostyu eyo vydeleniya i osvobozhdeniya soblyudenie pravilnogo poryadka raboty s dinamicheskoj pamyatyu polnostyu vozlagaetsya na programmista Ego oshibki sootvetstvenno mogut privodit k obrasheniyu po nekorrektnym adresam k prezhdevremennomu osvobozhdeniyu libo k utechke pamyati poslednee vozmozhno naprimer esli razrabotchik zabyl vyzvat free ili vyzyvayushuyu free funkciyu kogda eto trebovalos Odnoj iz chastyh oshibok yavlyaetsya otsutstvie proverok rezultata raboty funkcij vydeleniya pamyati malloc calloc i prochie na NULL v to vremya kak pamyat mozhet ne vydelitsya esli eyo ne hvataet ili esli byl zaproshen slishkom bolshoj obyom naprimer iz za privedeniya chisla 1 poluchennogo v rezultate kakih libo oshibochnyh matematicheskih operacij k bezznakovomu tipu size t s posleduyushimi operaciyami nad nim Eshyo odnoj problemoj sistemnyh funkcij raboty s pamyatyu yavlyaetsya nespecificirovannoe povedenie pri zaprose vydeleniya bloka nulevogo razmera funkcii mogut vernut kak NULL tak i dejstvitelnoe znachenie ukazatelya v zavisimosti ot konkretnoj realizacii Nekotorye konkretnye realizacii i storonnie biblioteki predostavlyayut takie sredstva kak podschyot ssylok i slabye ssylki umnye ukazateli a takzhe ogranichennye formy sborki musora no vse eti sredstva ne yavlyayutsya standartnymi chto estestvenno ogranichivaet ih primenenie Neeffektivnye i nebezopasnye stroki Dlya yazyka standartnymi yavlyayutsya nul terminirovannye stroki sootvetstvenno vse standartnye funkcii rabotayut imenno s nimi Eto reshenie privodit k znachitelnoj potere effektivnosti za schyot maloznachitelnoj ekonomii pamyati po sravneniyu s yavnym hraneniem razmera vychislenie dliny stroki funkciya strlen trebuet obhoda v cikle vsej stroki ot nachala do konca kopirovanie strok takzhe slozhno optimizirovat iz za nalichiya terminiruyushego nulya Iz za neobhodimosti dobavlyat k dannym stroki terminiruyushij nul stanovitsya nevozmozhnym effektivnoe poluchenie podstrok v vide srezov i rabota s nimi kak s obychnymi strokami vydelenie chastej strok i manipulyacii s nimi obychno trebuyut ruchnogo vydeleniya i osvobozhdeniya pamyati chto dopolnitelno povyshaet veroyatnost oshibki Nul terminirovannye stroki yavlyayutsya chastym istochnikom oshibok Dazhe standartnye funkcii obychno ne vypolnyayut proverki na razmer celevogo bufera i mogut ne dobavlyat v konce stroki nulevoj simvol ne govorya uzhe o tom chto on mozhet byt ne dobavlen ili zatyort iz za oshibki programmista Nebezopasnaya realizaciya funkcij s peremennym chislom argumentov Podderzhivaya funkcii s peremennym chislom argumentov Si ne soderzhit ni sredstv opredeleniya chisla i tipov fakticheskih parametrov peredannyh takoj funkcii ni mehanizma bezopasnogo dostupa k nim Informirovanie funkcii o sostave fakticheskih parametrov lezhit na programmiste a dlya dostupa k ih znacheniyam neobhodimo otschitat pravilnoe kolichestvo bajtov ot adresa poslednego fiksirovannogo parametra v steke libo vruchnuyu libo polzuyas naborom makrosov va arg iz zagolovochnogo fajla a href wiki Stdarg h title Stdarg h stdarg h a Pri etom neobhodimo uchityvat rabotu mehanizma avtomaticheskogo neyavnogo povysheniya tipov pri vyzove funkcij soglasno kotoromu celochislennye tipy argumentov razmerom menee int privodyatsya k int ili unsigned int a float privoditsya k double Oshibka v vyzove ili v rabote s parametrami vnutri funkcii proyavitsya tolko vo vremya ispolneniya programmy privodya k nepredskazuemym posledstviyam ot chteniya nevernyh dannyh do porchi steka Pri etom standartnym sredstvom formatirovannogo vvoda vyvoda yavlyayutsya imenno funkcii s peremennym chislom parametrov a href wiki Printf title Printf printf a scanf i drugie ne sposobnye proverit sootvetstvie spiska argumentov stroke formata Mnogie sovremennye kompilyatory provodyat takuyu proverku dlya kazhdogo ih vyzova generiruya preduprezhdeniya pri obnaruzhenii nesootvetstviya odnako v obshem sluchae podobnaya proverka nevozmozhna tak kak kazhdaya funkciya s peremennym chislom argumentov obrabatyvaet etot spisok po svoemu Nevozmozhno staticheski prokontrolirovat dazhe vse vyzovy funkcii printf poskolku stroka formata mozhet sozdavatsya v programme dinamicheski Otsutstvie unifikacii obrabotki oshibok Sintaksis Si ne vklyuchaet specialnogo mehanizma obrabotki oshibok Standartnaya biblioteka podderzhivaet lish prostejshie sredstva peremennaya v sluchae POSIX makros errno iz zagolovochnogo fajla a href wiki Errno h title Errno h errno h a dlya ustanovki koda poslednej oshibki i funkcii dlya polucheniya soobshenij ob oshibkah soglasno kodam Takoj podhod privodit k neobhodimosti pisat bolshoj obyom povtoryayushegosya koda smeshivaya osnovnoj algoritm s obrabotkoj oshibok k tomu zhe on ne yavlyaetsya potokobezopasnym Prichyom dazhe v etom mehanizme net edinogo poryadka bolshinstvo funkcij standartnoj biblioteki pri oshibke vozvrashaet marker 1 a sam kod trebuetsya poluchat iz errno esli funkciya ego vystavlyaet v standarte POSIX prinyato vozvrashat kod oshibki napryamuyu no ne vse funkcii etogo standarta tak delayut vo mnogih funkciyah naprimer fopen fread i fwrite vystavlenie errno ne standartizirovano i mozhet otlichatsya v raznyh realizaciyah v POSIX trebovaniya bolee strogie i ukazany nekotorye iz variantov vozmozhnyh oshibok est funkcii u kotoryh marker oshibki yavlyaetsya odnim iz dopustimyh vozvrashaemyh znachenij i pered ih vyzovom prihoditsya obnulyat errno chtoby byt uverennym chto kod oshibki byl ustanovlen imenno etoj funkciej V standartnoj biblioteke kody errno oboznachayutsya cherez makroopredeleniya i mogut imet odinakovye znacheniya chto ne dayot vozmozhnosti analizirovat kody oshibok cherez operator switch V yazyke net specialnogo tipa dannyh dlya flagov i kodov oshibok oni peredayutsya kak znacheniya tipa int Otdelnyj tip errno t dlya hraneniya koda oshibki poyavilsya lish v rasshirenii K standarta C11 i mozhet ne podderzhivatsya kompilyatorami Sposoby preodoleniya nedostatkov yazyka Nedostatki Si davno i horosho izvestny i s momenta poyavleniya yazyka predprinimalos mnozhestvo popytok povysit kachestvo i bezopasnost koda na Si ne prinosya v zhertvu ego vozmozhnosti Sredstva analiza korrektnosti koda Prakticheski vse sovremennye kompilyatory Si pozvolyayut provodit ogranichennyj staticheskij analiz koda s vydachej preduprezhdenij o potencialnyh oshibkah Takzhe podderzhivayutsya opcii vstraivaniya v kod proverok vyhoda za predely massiva razrusheniya steka vyhoda za predely dinamicheskoj pamyati chteniya neinicializirovannyh peremennyh vozmozhnostej neopredelyonnogo povedeniya i t p Odnako dopolnitelnye proverki mogut skazatsya na proizvoditelnosti itogovogo prilozheniya poetomu chashe vsego ih primenyayut tolko na etape otladki Sushestvuyut specialnye programmnye sredstva dlya staticheskogo analiza koda na Si dlya vyyavleniya ne sintaksicheskih oshibok Ih primenenie ne garantiruet bezoshibochnosti programm no pozvolyaet vyyavit znachitelnuyu chast tipichnyh oshibok i potencialnyh uyazvimostej Maksimalnyj effekt dannyh sredstv dostigaetsya ne pri epizodicheskom ispolzovanii a pri primenenii v sostave otrabotannoj sistemy postoyannogo kontrolya kachestva koda naprimer v sistemah nepreryvnoj integracii i razvyortyvaniya Takzhe mozhet trebovatsya annotirovanie koda specialnymi kommentariyami chtoby isklyuchit lozhnye srabatyvaniya analizatora na korrektnyh uchastkah koda formalno popadayushih pod kriterii oshibochnyh Standarty bezopasnogo programmirovaniya Vypusheno znachitelnoe kolichestvo issledovanij o pravilnom programmirovanii na Si ot nebolshih statej do obyomnyh knig Dlya podderzhaniya kachestva koda na Si prinimayutsya korporativnye i otraslevye standarty V chastnosti MISRA C standart razrabotannyj Motor Industry Software Reliability Association dlya ispolzovaniya Si v razrabotke vstroennyh sistem transportnyh sredstv Sejchas MISRA C ispolzuetsya vo mnogih otraslyah v tom chisle v voennoj medicinskoj i aerokosmicheskoj Redakciya 2013 goda soderzhit 16 direktiv i 143 pravila vklyuchayushie trebovaniya k kodu i ogranicheniya na ispolzovanie opredelyonnyh yazykovyh sredstv naprimer zapresheno ispolzovanie funkcij s peremennym chislom parametrov Na rynke imeetsya okolo desyatka instrumentov proverki koda na sootvetstvie MISRA C i neskolko kompilyatorov so vstroennoj proverkoj ogranichenij etogo standarta standart razrabatyvaemyj koordinacionnym centrom CERT On takzhe imeet celyu obespechenie nadyozhnogo i bezopasnogo programmirovaniya na Si Vklyuchaet pravila i rekomendacii dlya razrabotchikov v tom chisle primery nepravilnogo i pravilnogo koda po kazhdomu otdelno vzyatomu sluchayu Standart ispolzuetsya v razrabotke produktov takimi kompaniyami kak Cisco i Oracle Standarty POSIX Kompensacii nekotoryh nedostatkov yazyka sposobstvuet nabor standartov POSIX Standartiziruetsya ustanovka errno mnogimi funkciyami pozvolyaya obrabatyvat oshibki voznikayushie naprimer v funkciyah raboty s fajlami a takzhe vvodyatsya potokobezopasnye analogi nekotoryh funkcij standartnoj biblioteki bezopasnye varianty kotoryh v standarte yazyka prisutstvuyut lish v rasshirenii K Sm takzheC C Objective C Cyclone yazyk programmirovaniya Standartnaya biblioteka yazyka Si GoPrimechaniyaKommentarii B vtoraya bukva anglijskogo alfavita a C tretya bukva anglijskogo alfavita Pervoe poyavlenie znakovyh i bezznakovyh tipov char short int i long bylo v K amp R C Sootvetstvie formata tipov float i double standartu IEC 60559 opredelyaetsya rasshireniem F standarta Si poetomu format mozhet otlichatsya na otdelnyh platformah ili kompilyatorah Makros alignof iz zagolovochnogo fajla yavlyaetsya obyortkoj nad klyuchevym slovom b Alignof b Istochniki http www bell labs com usr dmr www chist html Rui Ueyama How I wrote a self hosting C compiler in 40 days angl www sigbus info dekabr 2015 Data obrasheniya 18 fevralya 2019 23 marta 2019 goda A garbage collector for C and C ot 13 oktyabrya 2005 na Wayback Machine angl Object Oriented Programming With ANSI C ot 6 marta 2016 na Wayback Machine angl Instantiable classed types objects angl GObject Reference Manual developer gnome org Data obrasheniya 27 maya 2019 27 maya 2019 goda Non instantiable classed types interfaces angl GObject Reference Manual developer gnome org Data obrasheniya 27 maya 2019 27 maya 2019 goda David R Sutton The syntax and semantics of the PROforma guideline modeling language angl David R Sutton John Fox Journal of the American Medical Informatics Association d 2003 4 June Vol 10 iss 5 P 433 443 ISSN 1067 5027 1527 974X doi 10 1197 jamia m1264 PMID 12807812 WD Q36247140 Papaspyrou 1998 1 1 The C programming language p 4 Ritchie Dennis M The development of the C language angl ACM SIGPLAN Notices d Proceedings of the 32nd ACM SIGPLAN SIGACT symposium on Principles of programming languages 1993 1 March Vol 28 iss 3 P 201 208 Data obrasheniya 22 yanvarya 2023 ISSN 0362 1340 doi 10 1145 155360 155580 WD Q55869040 Papaspyrou 1998 2 1 Selected issues from the syntax and semantics of C p 17 18 The GNU C Reference Manual neopr www gnu org Data obrasheniya 21 maya 2017 27 aprelya 2021 goda Width of Type The GNU C Library angl www gnu org Data obrasheniya 7 dekabrya 2018 9 dekabrya 2018 goda Chernovik standarta C17 6 2 5 Types s 31 Joint Technical Committee ISO IEC JTC 1 ISO IEC 9899 201x Programming languages C ISO IEC 2011 S 14 678 s 30 maya 2017 goda ot 30 maya 2017 na Wayback Machine Check 0 10 0 4 Advanced Features angl Check check sourceforge net Data obrasheniya 11 fevralya 2019 18 maya 2018 goda Type Conversion Macros GLib Reference Manual angl developer gnome org Data obrasheniya 14 yanvarya 2019 14 yanvarya 2019 goda INT01 C Use rsize t or size t for all integer values representing the size of an object SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 22 fevralya 2019 7 avgusta 2021 goda INT02 C Understand integer conversion rules SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 22 fevralya 2019 22 fevralya 2019 goda FLP02 C Avoid using floating point numbers when precise computation is needed SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 21 maya 2019 7 avgusta 2021 goda Chernovik standarta C17 IEC 60559 floating point arithmetic s 370 Chernovik standarta C17 7 12 Mathematics lt math h gt s 169 170 Poul Henning Kamp The Most Expensive One byte Mistake ACM Queue angl queue acm org 25 iyulya 2011 Data obrasheniya 28 maya 2019 30 aprelya 2019 goda Podbelskij Fomin 2012 s 19 unicode 7 Linux manual page angl man7 org Data obrasheniya 24 fevralya 2019 25 fevralya 2019 goda The wchar t mess GNU libunistring angl www gnu org Data obrasheniya 2 yanvarya 2019 17 sentyabrya 2019 goda Programming with wide characters angl Linux com The source for Linux information 11 fevralya 2006 Data obrasheniya 7 iyunya 2019 7 iyunya 2019 goda Markus Kuhn UTF 8 and Unicode FAQ angl www cl cam ac uk Data obrasheniya 25 fevralya 2019 27 fevralya 2019 goda Defect Report Summary for C11 neopr www open std org Data obrasheniya 2 yanvarya 2019 1 yanvarya 2019 goda Chernovik standarta C17 s 84 Standard Enumerations GTK 3 Reference Manual angl developer gnome org Data obrasheniya 15 yanvarya 2019 14 yanvarya 2019 goda Object properties GObject Reference Manual angl developer gnome org Data obrasheniya 15 yanvarya 2019 16 yanvarya 2019 goda Using the GNU Compiler Collection GCC Common Type Attributes angl gcc gnu org Data obrasheniya 19 yanvarya 2019 16 yanvarya 2019 goda ARR00 C Understand how arrays work SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 30 maya 2019 30 maya 2019 goda ARR32 C Ensure size arguments for variable length arrays are in a valid range SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 18 fevralya 2019 19 fevralya 2019 goda Chernovik standarta C17 6 7 9 Initialization s 101 DCL38 C Use the correct syntax when declaring a flexible array member SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 21 fevralya 2019 22 fevralya 2019 goda OpenSSL version angl www openssl org Data obrasheniya 9 dekabrya 2018 9 dekabrya 2018 goda Version Information GTK 3 Reference Manual angl developer gnome org Data obrasheniya 9 dekabrya 2018 16 noyabrya 2018 goda PRE10 C Wrap multistatement macros in a do while loop SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 9 dekabrya 2018 9 dekabrya 2018 goda PRE01 C Use parentheses within macros around parameter names SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 9 dekabrya 2018 9 dekabrya 2018 goda PRE06 C Enclose header files in an include guard SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 25 maya 2019 25 maya 2019 goda Chernovik standarta C17 5 1 2 2 Hosted environment s 10 11 Chernovik standarta C17 6 2 4 Storage durations of objects s 30 Chernovik standarta C17 7 22 4 4 The exit function s 256 MEM05 C Avoid large stack allocations SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 24 maya 2019 24 maya 2019 goda Chernovik standarta C17 6 7 1 Storage class specifiers s 79 Chernovik standarta C17 6 7 6 3 Function declarators including prototypes s 96 Ukazateli v C abstraktnee chem mozhet pokazatsya neopr www viva64 com Data obrasheniya 30 dekabrya 2018 30 dekabrya 2018 goda Tanenbaum Endryu S Bos Herbert Sovremennye operacionnye sistemy 4 e izd SPb Izdatelskij dom Piter 2019 S 828 1120 s Klassika Computer science ISBN 9785446111558 7 avgusta 2021 goda ot 7 avgusta 2021 na Wayback Machine Jonathan Corbet Ripples from Stack Clash angl lwn net 28 iyunya 2017 Data obrasheniya 25 maya 2019 25 maya 2019 goda Hardening ELF binaries using Relocation Read Only RELRO angl www redhat com Data obrasheniya 25 maya 2019 25 maya 2019 goda Traditional Process Address Space Static Program angl www openbsd org Data obrasheniya 4 marta 2019 8 dekabrya 2019 goda Dr Thabang Mokoteli ICMLG 2017 5th International Conference on Management Leadership and Governance Academic Conferences and publishing limited 2017 03 S 42 567 s ISBN 9781911218289 7 avgusta 2021 goda ot 7 avgusta 2021 na Wayback Machine Traditional Process Address Space Program w Shared Libs angl www openbsd org Data obrasheniya 4 marta 2019 8 dekabrya 2019 goda ERR30 C Set errno to zero before calling a library function known to set errno and check errno only after the function returns a value indicating failure SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 23 maya 2019 19 noyabrya 2018 goda ERR33 C Detect and handle standard library errors SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 23 maya 2019 23 maya 2019 goda sys types h 0p Linux manual page angl man7 org Data obrasheniya 23 maya 2019 23 maya 2019 goda ERR02 C Avoid in band error indicators SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 4 yanvarya 2019 5 yanvarya 2019 goda FIO34 C Distinguish between characters read from a file and EOF or WEOF SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 4 yanvarya 2019 4 yanvarya 2019 goda Coding Style angl The systemd System and Service Manager github com Data obrasheniya 1 fevralya 2019 31 dekabrya 2020 goda Error Reporting GLib Reference Manual angl developer gnome org Data obrasheniya 1 fevralya 2019 2 fevralya 2019 goda Eina Error angl docs enlightenment org Data obrasheniya 1 fevralya 2019 2 fevralya 2019 goda DCL09 C Declare functions that return errno with a return type of errno t SEI CERT C Coding Standard Confluence neopr wiki sei cmu edu Data obrasheniya 21 dekabrya 2018 21 dekabrya 2018 goda FLP32 C Prevent or detect domain and range errors in math functions SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 5 yanvarya 2019 5 yanvarya 2019 goda MEM12 C Consider using a goto chain when leaving a function on error when using and releasing resources SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 4 yanvarya 2019 5 yanvarya 2019 goda ERR04 C Choose an appropriate termination strategy SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 4 yanvarya 2019 5 yanvarya 2019 goda MEM31 C Free dynamically allocated memory when no longer needed SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 6 yanvarya 2019 6 yanvarya 2019 goda Using the GNU Compiler Collection GCC Standards angl gcc gnu org Data obrasheniya 23 fevralya 2019 17 iyunya 2012 goda Language Compatibility angl clang llvm org Data obrasheniya 23 fevralya 2019 19 fevralya 2019 goda Clang 6 0 0 Release Notes Clang 6 documentation neopr releases llvm org Data obrasheniya 23 fevralya 2019 23 fevralya 2019 goda Siddhesh Poyarekar The GNU C Library version 2 29 is now available angl sourceware org Data obrasheniya 2 fevralya 2019 2 fevralya 2019 goda Alpine Linux has switched to musl libc Alpine Linux angl alpinelinux org Data obrasheniya 2 fevralya 2019 3 fevralya 2019 goda musl Void Linux Handbook neopr docs voidlinux org Data obrasheniya 29 yanvarya 2022 9 dekabrya 2021 goda Osobennosti biblioteki CRT rus docs microsoft com Data obrasheniya 2 fevralya 2019 7 avgusta 2021 goda Supported Languages Features CLion angl JetBrains Data obrasheniya 23 fevralya 2019 25 marta 2019 goda Check 0 10 0 2 Unit Testing in C angl check sourceforge net Data obrasheniya 23 fevralya 2019 5 iyunya 2018 goda 6 Callgrind a call graph generating cache and branch prediction profiler angl Valgrind Documentation valgrind org Data obrasheniya 21 maya 2019 23 maya 2019 goda KCachegrind neopr kcachegrind sourceforge net Data obrasheniya 21 maya 2019 6 aprelya 2019 goda Emscripten LLVM to JavaScript compiler neopr Data obrasheniya 25 sentyabrya 2012 17 dekabrya 2012 goda Flash C Compiler neopr Data obrasheniya 25 yanvarya 2013 25 maya 2013 goda Proekt Clue na sajte SourceForge net Axiomatic Solutions Sdn Bhd neopr Data obrasheniya 7 marta 2009 23 fevralya 2009 goda ClangFormat Clang 9 documentation angl clang llvm org Data obrasheniya 5 marta 2019 6 marta 2019 goda indent 1 Linux man page angl linux die net Data obrasheniya 5 marta 2019 13 maya 2019 goda Wolfram Research Inc SYSTEMS INTERFACES AND DEPLOYMENT angl Wolfram Mathematica Tutorial Collection 36 37 library wolfram com 2008 Data obrasheniya 29 maya 2019 6 sentyabrya 2015 goda Cleve Moler The Growth of MATLAB and The MathWorks over Two Decades neopr TheMathWorks News amp Notes www mathworks com yanvar 2006 Data obrasheniya 29 maya 2019 4 marta 2016 goda sched setscheduler angl pubs opengroup org Data obrasheniya 4 fevralya 2019 24 fevralya 2019 goda clock gettime angl pubs opengroup org Data obrasheniya 4 fevralya 2019 24 fevralya 2019 goda clock nanosleep angl pubs opengroup org Data obrasheniya 4 fevralya 2019 24 fevralya 2019 goda M Dzhons Anatomiya Linux arhitektur realnogo vremeni rus www ibm com 30 oktyabrya 2008 Data obrasheniya 4 fevralya 2019 7 fevralya 2019 goda TIOBE Index angl www tiobe com Data obrasheniya 2 fevralya 2019 25 fevralya 2018 goda Stroustrup Bjarne Evolving a language in and for the real world C 1991 2006 neopr Data obrasheniya 9 iyulya 2018 20 noyabrya 2007 goda Stroustrup FAQ neopr www stroustrup com Data obrasheniya 3 iyunya 2019 6 fevralya 2016 goda Annex 0 Compatibility 1 2 C and ISO C neopr Working Paper for Draft Proposed International Standard for Information Systems Programming Language C 2 dekabrya 1996 sm 1 2 1p3 paragraf 3 v razdele 1 2 1 Data obrasheniya 6 iyunya 2009 Arhivirovano 22 avgusta 2011 goda Stolyarov 2010 1 Predislovie p 79 Letopis yazykov Si rus Izdatelstvo Otkrytye sistemy Data obrasheniya 8 dekabrya 2018 9 dekabrya 2018 goda Allen I Holub Enough Rope to Shoot Yourself in the Foot Rules for C and C Programming McGraw Hill 1995 214 s ISBN 9780070296893 9 dekabrya 2018 goda ot 9 dekabrya 2018 na Wayback Machine Using the GNU Compiler Collection GCC Warning Options neopr gcc gnu org Data obrasheniya 8 dekabrya 2018 5 dekabrya 2018 goda Diagnostic flags in Clang Clang 8 documentation neopr clang llvm org Data obrasheniya 8 dekabrya 2018 9 dekabrya 2018 goda MemorySanitizer Clang 8 documentation angl clang llvm org Data obrasheniya 8 dekabrya 2018 1 dekabrya 2018 goda MEM00 C Allocate and free memory in the same module at the same level of abstraction SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 4 iyunya 2019 4 iyunya 2019 goda MEM04 C Beware of zero length allocations SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 11 yanvarya 2019 12 yanvarya 2019 goda Object memory management GObject Reference Manual neopr developer gnome org Data obrasheniya 9 dekabrya 2018 7 sentyabrya 2018 goda Naprimer snai pe c smart pointers ot 14 avgusta 2018 na Wayback Machine Garbage Collection in C Programs neopr Data obrasheniya 16 maya 2019 27 marta 2019 goda CERN Computer Security Information neopr security web cern ch Data obrasheniya 12 yanvarya 2019 5 yanvarya 2019 goda CWE CWE 170 Improper Null Termination 3 2 angl cwe mitre org Data obrasheniya 12 yanvarya 2019 13 yanvarya 2019 goda STR32 C Do not pass a non null terminated character sequence to a library function that expects a string SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 12 yanvarya 2019 13 yanvarya 2019 goda DCL50 CPP Do not define a C style variadic function SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 25 maya 2019 25 maya 2019 goda EXP47 C Do not call va arg with an argument of the incorrect type SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 8 dekabrya 2018 9 dekabrya 2018 goda SEI CERT C Coding Standard SEI CERT C Coding Standard Confluence neopr wiki sei cmu edu Data obrasheniya 9 dekabrya 2018 8 dekabrya 2018 goda Introduction SEI CERT C Coding Standard Confluence neopr wiki sei cmu edu Data obrasheniya 24 maya 2019 24 maya 2019 goda CON33 C Avoid race conditions when using library functions SEI CERT C Coding Standard Confluence angl wiki sei cmu edu Data obrasheniya 23 yanvarya 2019 23 yanvarya 2019 goda LiteraturaISO IEC Programming languages C neopr www open std org 2017 Data obrasheniya 3 dekabrya 2018 Arhivirovano iz originala 24 oktyabrya 2018 goda Kernigan B Ritchi D Yazyk programmirovaniya Si The C programming language 2 e izd M 2007 S 304 ISBN 0 13 110362 8 Gukin D Yazyk programmirovaniya Si dlya chajnikov C For Dummies M 2006 S 352 ISBN 0 7645 7068 4 Podbelskij V V Fomin S S Kurs programmirovaniya na yazyke Si uchebnik M DMK Press 2012 318 s ISBN 978 5 94074 449 8 Prata S Yazyk programmirovaniya S Lekcii i uprazhneniya C Primer Plus M Vilyams 2006 S 960 ISBN 5 8459 0986 4 Prata S Yazyk programmirovaniya C C11 Lekcii i uprazhneniya 6 e izdanie C Primer Plus 6th Edition M Vilyams 2015 928 s ISBN 978 5 8459 1950 2 Stolyarov A V Yazyk Si i nachalnoe obuchenie programmirovaniyu Sbornik statej molodyh uchyonyh fakulteta VMK MGU Izdatelskij otdel fakulteta VMK MGU 2010 7 S 78 90 Shildt G C polnoe rukovodstvo klassicheskoe izdanie C The Complete Reference 4th Edition M 2010 S 704 ISBN 978 5 8459 1709 6 Yazyki programmirovaniya Ada Si Paskal Comparing and Assessong Programming Languages Ada C and Pascal A Fyuer N Dzhehani M Radio i Sayaz 1989 368 s 50 000 ekz ISBN 5 256 00309 7 Papaspyrou N S A Formal Semantics for the C Programming Language angl 22 yanvarya 2023 doctoral dissertation National Technical University of Athens 1998 February SsylkiSi Knigi v VikiuchebnikeMediafajly na Vikisklade ISO IEC JTC1 SC22 WG14 official home angl Oficialnaya stranica mezhdunarodnoj rabochej gruppy po standartizacii yazyka programmirovaniya Si Data obrasheniya 20 fevralya 2009 Arhivirovano 22 avgusta 2011 goda WG14 N1124 angl ISO IEC 9899 Programming languages C Approved standards ISO IEC JTC1 SC22 WG14 6 maya 2005 Standart ISO IEC 9899 1999 C99 ISO IEC 9899 1999 Cor 1 2001 E TC1 Technical Corrigendum 1 ot 2001 goda ISO IEC 9899 1999 Cor 2 2004 E TC2 Technical Corrigendum 2 ot 2004 goda Data obrasheniya 20 fevralya 2009 Arhivirovano 22 avgusta 2011 goda C The ISO Standard Rationale Revision 5 10 angl aprel 2004 Obosnovanie i poyasneniya dlya standarta C99 Data obrasheniya 20 fevralya 2009 Arhivirovano 22 avgusta 2011 goda Cppreference com podderzhivaemyj entuziastami viki spravochnik s bolshoj podborkoj dannyh po yazykam Si i C ih standartam a takzhe materialam svyazannym s etimi yazykami i ih razrabotkoj SEI CERT C Coding Standard ili SEI CERT C Coding Standard 2016 Edition standart bezopasnogo programmirovaniya na yazyke Si Romanov E Si Si Ot diletanta do professionala neopr ermak cs nstu ru Data obrasheniya 25 maya 2015
Вершина