Язык Си с нуля - Урок 24 - Динамическое распределение памяти, void*, утечки памяти.

preview_player
Показать описание
Это видео для тех, кто еще ни разу не программировал, но прошел предыдущие 23 урока.

В данном уроке мы изучим:
+ как динамически выделить память под указатель
+ как освободить память
+ что такое утечка памяти
+ что такое void*

Уроки по теме:

Язык Си с нуля - данный видеокурс предназначен для тех, кто еще ни разу не программировал. Здесь я максимально понятно пошагово обьясняю основы программирования на языке Си. Если хотите научиться программировать на языке Си - пройдите весь курс. Помимо объяснения материала я даю домашку. А после каждых нескольких уроков мы вместе пишем забавные игры!)
Рекомендации по теме
Комментарии
Автор

Огромное спасибо. Ну реально препод от бога. Люди не жлобите лайк, материал ведь годный)

kig
Автор

У тебя самые классные и максимально понятные уроки по Си

МаксимПопов-цв
Автор

Благодарю за урок + с уважением, Евген.

bishop_ru
Автор

Спосибо автору так приятно и понятно смотреть ролик
Ведь не каждый может или хочет доходчиво обяснить
Есть много роликов где не то что учат а как буд то смотришь новости где быстро как из пулемета стреляют словами и пишут код, смотришь и говоришь себе зачем я трачу драгоценное время в пустую.

SAM-tks
Автор

Прошу заметить что функция free не возвращает бесплатную картошку фри!

ДмитрийКошелев-пэ
Автор

Вот только то сколько памяти занимает указатель не постоянная величина, а зависящая от размера компьютерного слова. На системах с разрядностью 32 это, и в правду, 4, а вот когда разрядность 64 размер указателя уже будет 8.

okhramkov
Автор

while(1)
{
printf("top!");
cout << "top!" << endl;
}

ylikitishnik
Автор

указатель может занимать 8 байт смотря какая архитектура

marspriyom
Автор

Одно замечание. Новичкам трудно иногда уследить за мыслью при таком темпе изложения.

sergepisarsky
Автор

Немогу понять зачем нужно в си работать с кучей(ведь столько много требований синтаксиса с динамической памятью), ведь уже написан си++(где это на много проще), который в автоматическом режиме контролирует, что бы не было утечки памяти по неосторожности программиста?

ИринаИрина-шыр
Автор

Зачем в функцию malloc вставлять метод sizeof, ведь все указатели любого типа занимают 4 байта, почему нельзя просто указать 4?

ashesha
Автор

Антон что будет если я укажу меньше байт необходимого указателю, например 2 вместо 4?

temirkhanamanbaev
Автор

Антош, а почему ты не рассказал, что желательно в int main() вписывать в аргументы void, в плюсах понятно, что когда ты оставляешь мейн фукнцию без аргументов это значит, что для функции не разрешены параметры. В практике бывали ворнинги от компилятора, когда main оставался без void

cytorak
Автор

почему на экран выводится 333??? Ведь условие содержит, что на экран вывести 333, если х != NULL. Но ведь int *х = NULL на строке 9!!!

weekendshow
Автор

в 32 разрядной системе указатель занимает 4 байта, в 64 разрядной 8

завтра на 8 разрядном стм 8 запущу, интересно что будет, тк однобайтовый указатель бредово звучит, тк объем оперативки там килобайт)

ПетрКрупин-фж
Автор

А почему в девятой строке не выдаёт никаких ошибок? Там должно быть приведение типов (int*) перед функцией malloc . У меня только так сработало.

dauletalmas
Автор

Компилятор упорно выдаёт ошибку и отказывается присваивать и выводить значение строке.
Можете подсказать в чем проблема?
char *z = NULL;



z = malloc(sizeof(char));




if ( z != NULL){
*z = "tree";
printf("%s\n", *z);
}

smeh_noi
Автор

Почему у меня все равно показывает 8 байт вместо 4?

temirkhanamanbaev
Автор

Собственно, проблема в том, что последний printf не срабатывает. Если кто знает почему, напишите в ответы пожалуйста.
Код:
#include <stdio.h>
#include <stdlib.h>

int main()
{

double *dPtr = NULL;
int *iPtr = NULL;
float *fPtr = NULL;


dPtr = malloc(sizeof(double));
iPtr = malloc(sizeof(int));
fPtr = malloc(sizeof(float));

if((dPtr != NULL) && (iPtr != NULL) && (fPtr != NULL)){
*dPtr = 1.1;
*iPtr = 1;
*fPtr = 1.11;

printf("*dPtr = %f;\n *iPtr = %i;\n *fPtr = %f;\n\n", *dPtr, *iPtr, *fPtr);

free(dPtr);
free(iPtr);
free(fPtr);
dPtr = NULL;
iPtr = NULL;
fPtr = NULL;

}

if((dPtr = NULL) && (iPtr = NULL) && (fPtr = NULL)){
printf("Success.");
}
}

ЛирикГорбун