1 of 13

Динамична памет

2 of 13

Static vs. Dynamic memory

  • Статична (автоматична) памет е всичката памет, която сме ползвали до сега
    • Например int variable; заделя памет за променлива от тип int и тази памет автоматично се освобождава
      • Колко?
      • Кога?
    • Scope / Block - { }
  • Динамична памет - трябва ние да се грижим за заделянето и освобождаването й.

3 of 13

Stack vs. Heap

  • Stack е малко парче от цялата памет, което представлява статичната памет за нашата програма
  • Heap е останалата памет - парчета от която всички програми могат да поискат по време на тяхното изпълнение (динамично)
  • Всички променливи и масиви се заделят в статичната памет
  • За да използваме памет от Heap-а трябва да я поискаме по време на изпълнението на нашата програма и да се грижим за нейното освобождаване

4 of 13

malloc & free

  • Намират се в стандартната библиотека stdlib
  • void *malloc(size_t size); - “иска” определено количество памет (байтове) от хийпа
    • Защо void*?
    • Ами ако няма памет?
    • Какви стойности ще има в дадената ни памет?
  • void free(void *ptr); - “връща” вече ненужната динамична памет на операционната система
    • Хубаво е след като освободим паметта да насочим указателя към NULL - защо?

5 of 13

Работа с динамична памет

  1. Определяме колко памет ни трябва - sizeof
  2. Искаме толкова памет - malloc
  3. Работим с паметта - пишем и четем
  4. Освобождаваме паметта - free

6 of 13

Колко памет трябва за масив от 10 int-а?

7 of 13

Колко памет трябва за стринга “1234”?

8 of 13

memset & memcpy

  • И двете се намират в библиотеката string.h
  • void *memset(void *s, int c, int n); - задава първите n байта от паметта с константата c
    • Какво ще направи memset(mem_ptr, 1, 10) ?
  • void *memcpy(void *dst, const void *src, size_t n); - копира първите n байта от src в dst
    • връща указател към dst

9 of 13

Memory leaking

  • Когато нашата програма не освобождава заетата от нея памет
  • По някое време паметта свършва
  • Можем да използваме valgrind за да проверяваме дали нашата програма не “лийква”

10 of 13

Задача

  • Напишете програма, която заделя памет за 10 int-а, записва числата от 1 до 10 в нея, принтира ги и освобождава паметта.

#include <stdlib.h>�#include <stdio.h>�int main() {� int *ptr = malloc(sizeof(int) * 10);� � for(int i = 1; i <= 10; i++) {� ptr[i - 1] = i; � printf(“%d ”, ptr[i - 1]);� }�� free(ptr);�}

11 of 13

valgrind demo

12 of 13

Задачи

  • Напишете програма, която прочита число - големината на масив (който се заделя динамично) - след това чете толкова на брой букви и ги извежда в обратен ред
  • Четете от стандартния вход символи до достигане на EOF. Изведете всички прочетени символи на обратно. Няма ограничение колко символа могат да се прочетат. (погледнете функцията realloc)

13 of 13

Въпроси?