Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 17

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

НаконСц, упомянСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ (threads), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ нСсколько Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ исполнСния Π² Ρ€Π°ΠΌΠΊΠ°Ρ… СдинствСнного адрСсного пространства. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° имССтся свой собствСнный стСк, Π° Ρ‚Π°ΠΊΠΆΠ΅ способ получСния Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ρ‚.Π΅. динамичСски выдСляСмых Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ использования этим ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. ΠœΡ‹ большС Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это являСтся ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΉ Ρ‚Π΅ΠΌΠΎΠΉ.

3.2. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти

Π§Π΅Ρ‚Ρ‹Ρ€Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ основу управлСния динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π‘ ΠœΡ‹ опишСм сначала ΠΈΡ…, Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‚ описания Π΄Π²ΡƒΡ… систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… построСны эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² C++ new ΠΈ delete.

НаконСц, ΠΌΡ‹ обсудим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚, Π½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

3.2.1. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹: malloc(), calloc(), realloc(), free()

Π”ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ malloc() ΠΈΠ»ΠΈ calloc(). Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Когда Ρƒ вас Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊ памяти ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ realloc(). ДинамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ освобоТдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ free().

ΠžΡ‚Π»Π°Π΄ΠΊΠ° использования динамичСской памяти сама ΠΏΠΎ сСбС являСтся Π²Π°ΠΆΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΠΎΠΉ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для этой Ρ†Π΅Π»ΠΈ ΠΌΡ‹ обсудим Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.5.2 Β«ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΈ выдСлСния памяти».

3.2.1.1. ИсслСдованиС подробностСй Π½Π° языкС Π‘

Π’ΠΎΡ‚ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Ρ‚Π΅ΠΌΡ‹ справки GNU/Linux malloc(3):

#include <stdlib.h> /* ISO Π‘ */


void *calloc(size_t nmemb, size_t size);

 /* Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нулями */

void *malloc(size_t size);

 /* Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π΅Π· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ */

void free(void *ptr);

 /* ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ */

void *realloc(void *ptr, size_t size);

 /* Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти */

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ выдСлСния памяти Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚ΠΈΠΏ void*. Π­Ρ‚ΠΎ бСстиповый ΠΈΠ»ΠΈ ΠΎΠ±Ρ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, всС, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ β€” это привСсти Π΅Π³ΠΎ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΈ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²ΠΏΠ΅Ρ€Π΅Π΄ΠΈ.

Π’ΠΈΠΏ size_t являСтся Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для динамичСского выдСлСния памяти, ΠΈ Π΄Π°Π»Π΅Π΅ Π² ΠΊΠ½ΠΈΠ³Π΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ мноТСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π΅Π³ΠΎ использования. На Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ соврСмСнных систСм size_t являСтся unsigned long, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ явно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ size_t вмСсто простого Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° unsigned.

Π’ΠΈΠΏ ptrdiff_t ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для вычислСния адрСса Π² Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠ°ΠΊ Π² случаС вычислСния указатСля Π² массивС:

#define MAXBUF ...

char *p;

char buf[MAXBUF];

ptrdiff_t where;


p = buf;

while (/* Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ условиС */) {

 ...

 p += something;

 ...

 where = p - buf; /* ΠΊΠ°ΠΊΠΎΠΉ Ρƒ нас индСкс? */

}

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <stdlib.h> ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ мноТСство стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π‘ ΠΈ Ρ‚ΠΈΠΏΠΎΠ² (Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ size_t), ΠΎΠ½ опрСдСляСт Ρ‚Π°ΠΊΠΆΠ΅ константу прСпроцСссора NULL, которая прСдставляСт Β«Π½ΡƒΠ»ΡŒΒ» ΠΈΠ»ΠΈ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. (Π­Ρ‚ΠΎ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊΠΎΠ΅, ΠΊΠ°ΠΊ 0 ΠΈΠ»ΠΈ '((void*)0)'. Π―Π²Π½ΠΎΠ΅ использованиС 0 относится ΠΊ ΡΡ‚ΠΈΠ»ΡŽ Π‘++; Π² Π‘, ΠΎΠ΄Π½Π°ΠΊΠΎ, NULL являСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ для ΠΊΠΎΠ΄Π° Π‘.)

3.2.1.2. ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти: malloc()

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ выдСляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ malloc(). ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ являСтся ΠΎΠ±Ρ‰ΠΈΠΌ числом Π·Π°Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ². Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° вновь Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти ΠΈΠ»ΠΈ NULL, Ссли ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π’ послСднСм случаС для обозначСния ошибки Π±ΡƒΠ΄Π΅Ρ‚ установлСн errno. (errno являСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ для указания ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠ΅ΠΉ ошибки. Она описываСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.3 Β«ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ошибок».) НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… структур. Код выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

struct coord { /* 3D ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ */

 int x, y, z;

} *coordinates;

unsigned int count; /* сколько Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ */

size_t amount; /* ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти */

/* ... ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ число... */

amount = count * sizeof(struct coord); /* сколько Π±Π°ΠΉΡ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ */

coordinates = (struct coord*)malloc(amount); /* Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ */

if (coordinates == NULL) {

 /* ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± ошибкС, Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ */

}

/* ... ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹... */

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ здСсь шаги ΡΠ²Π»ΡΡŽΡ‚ΡΡ стСрСотипными. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

1. ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° для Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти.

2. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ выдСляСмой памяти Π² Π±Π°ΠΉΡ‚Π°Ρ…. Для этого Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ число Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…. ПослСдний получаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π‘ sizeof, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ для этой Ρ†Π΅Π»ΠΈ ΠΈ сущСствуСт (наряду с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, хотя Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ структуры срСди Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… компиляторов ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ, sizeof всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π΅Ρ€Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° исходный ΠΊΠΎΠ΄ остаСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ пСрСносимым.

ΠŸΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ массивов для строк символов ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° char Π½Π΅Ρ‚ нСобходимости умноТСния Π½Π° sizeof(char), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ послСднСС ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ всСгда Ρ€Π°Π²Π½ΠΎ 1. Но Π² любом случаС это Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚.

3. Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ malloc(), присвоив Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ указатСля. Π₯ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ являСтся ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ malloc() значСния ΠΊ Ρ‚ΠΈΠΏΡƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ присваиваСтся. Π’ Π‘ этого Π½Π΅ трСбуСтся (хотя компилятор ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅). ΠœΡ‹ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ всСгда ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π° C++ присвоСниС знамСния указатСля ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ привСдСния Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠ°ΠΊΠΎΠΉ Π±Ρ‹ Π½ΠΈ Π±Ρ‹Π» контСкст. Для управлСния динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C++ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ new ΠΈ delete, Π° Π½Π΅ malloc() ΠΈ free(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.

4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Никогда Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π±Ρ‹Π»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ. Если Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, malloc() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ NULL. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° ΠΈΠ·-Π·Π° Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ сСгмСнтации (segmentation violation), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ использования памяти Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ своСго адрСсного пространства.

Если Π²Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π΄Π°Ρ‚ΡŒ диагностичСскоС сообщСниС ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Или ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ восстановлСния.

Π’Ρ‹Π΄Π΅Π»ΠΈΠ² Π±Π»ΠΎΠΊ памяти ΠΈ установив Π² coordinates ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Π³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ coordinates ΠΊΠ°ΠΊ массив, хотя ΠΎΠ½ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ:

int cur_x, cur_y, cur_z;

size_t an_index;

an_index = something;

cur_x = coordinates[an_index].x;

cur_y = coordinates[an_index].y;

cur_z = coordinates[an_index].z;

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ создаСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для индСксирования Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ структуры coordinates[an_index].

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•. Π‘Π»ΠΎΠΊ памяти, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ malloc(), Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ любой случайный мусор. НСобходимо сразу ΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ значСниями ΠΈΠ»ΠΈ хотя Π±Ρ‹ нулями. Π’ послСднСм случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ memset() (которая обсуТдаСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 12.2 «НизкоуровнСвая ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ memXXX()):

memset(coordinates, '\0', amount);

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ являСтся использованиС calloc(), которая вскорС Π±ΡƒΠ΄Π΅Ρ‚ описана.

Π”ΠΆΠ΅Ρ„Ρ„ КольС (Geoff Collyer) Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΡƒ для выдСлСния памяти:

some_type *pointer;

pointer = malloc(count * sizeof(*pointer));

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ malloc() Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ количСство памяти Π±Π΅Π· нСобходимости ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ объявлСниС pointer. Если Ρ‚ΠΈΠΏ pointer впослСдствии измСнится, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ sizeof автоматичСски Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ выдСляСмоС число Π±Π°ΠΉΡ‚ΠΎΠ² остаСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ. (ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° Π”ΠΆΠ΅Ρ„Ρ„Π° опускаСт ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ обсуТдали. НаличиС Ρ‚Π°ΠΌ привСдСния Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ диагностику, Ссли Ρ‚ΠΈΠΏ pointer измСнится, Π° Π²Ρ‹Π·ΠΎΠ² malloc() Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½.)

3.2.1.3. ОсвобоТдСниС памяти: free()

Когда Π²Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ использованиС памяти, Β«Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΒ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ free(). ЕдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ с использованиСм Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выдСлСния. МоТно (хотя это бСсполСзно) ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free() пустой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ: