Спосибо автору так приятно и понятно смотреть ролик Ведь не каждый может или хочет доходчиво обяснить Есть много роликов где не то что учат а как буд то смотришь новости где быстро как из пулемета стреляют словами и пишут код , смотришь и говоришь себе зачем я трачу драгоценное время в пустую.
Вот только то сколько памяти занимает указатель не постоянная величина, а зависящая от размера компьютерного слова. На системах с разрядностью 32 это, и в правду, 4, а вот когда разрядность 64 размер указателя уже будет 8.
Если пытаюсь присвоить что-то нетипизированному указателю, пишет что неприсваиваемый тип войд: void* a = malloc(sizeof(int)); *a = 13; Компилятор ругается, так же и при попытке вывести через принтф данные по адресу *a
Немогу понять зачем нужно в си работать с кучей(ведь столько много требований синтаксиса с динамической памятью),ведь уже написан си++(где это на много проще) ,который в автоматическом режиме контролирует,что бы не было утечки памяти по неосторожности программиста?
Ага, особенно когда человек склонен терять концентрацию и задумывается о своём, как я) -это проблема ученика, а не учителя..?- А ещё лично я лучше понимаю на картинках и реальных примерах - беря в пример какие-то функции игр, например.. Кстати, для лучшего усвоения можно включить субтитры и/или замедлить скорость и вслушиваться, смотря в пустоту, представляя сказанное, т.к. изображение перед гладит может привлекать внимание и, ну, мешать Ну.. Или ещё как вариант - остановить воспроизведение, подумать о чём нужно, глубоко подышать (помедитировать, сконцентрироваться) и продолжить xD С другой стороны.. Если совсем уж никак настроиться - стоит лечь спать и отложить обучение на пробуждение.. 🤔
Антош, а почему ты не рассказал, что желательно в int main() вписывать в аргументы void, в плюсах понятно, что когда ты оставляешь мейн фукнцию без аргументов это значит, что для функции не разрешены параметры. В практике бывали ворнинги от компилятора, когда main оставался без void
@@beginend95 рабочие моменты, будешь продолжать плейлист?) Всем, кто будет читать это, вот вам хороший совет: Всегда указывать аргумент void в int main (). Потому что такие компиляторы как clang, amd x86 open64 compiler suite, open watcom, digital mars (dm чаще пишут), часто ругаются за отсутствие void в качестве аргумента в ведущей функции! В плюсах можете об этом забыть, там все лучше
@@ЖораКоваль-е9с вообще да, но как я и написал выше это свойственно лишь некоторым компиляторам, в gcc, icc, clang этого нет не сегодняшний день. Если вы используете какой-то DM, то там это возможно, хотя в настоящий момент этого может и не быть
в 32 разрядной системе указатель занимает 4 байта, в 64 разрядной 8 завтра на 8 разрядном стм 8 запущу , интересно что будет, тк однобайтовый указатель бредово звучит, тк объем оперативки там килобайт)
потому что мы выделяем память не для адреса (указателя), а для ячейки памяти определенного типа, которая хранит значение (например int). Если будет char *c, то нужно будет выделить всего 1 байт. + Нам может понадобиться выделить память для структуры.
Компилятор упорно выдаёт ошибку и отказывается присваивать и выводить значение строке. Можете подсказать в чем проблема? char *z = NULL; z = malloc(sizeof(char)); if ( z != NULL){ *z = "tree"; printf("%s ", *z); }
@@MC-hd5ebэто происходит по другой причине. Если выделить необходимый размер памяти, то тоже ошибку выдаст. Один массив в другой только через цикл можно скопировать.
Собственно, проблема в том, что последний printf не срабатывает. Если кто знает почему, напишите в ответы пожалуйста. Код: #include #include int main() {
Огромное спасибо. Ну реально препод от бога. Люди не жлобите лайк, материал ведь годный)
У тебя самые классные и максимально понятные уроки по Си
Благодарю за урок + с уважением, Евген.
Спосибо автору так приятно и понятно смотреть ролик
Ведь не каждый может или хочет доходчиво обяснить
Есть много роликов где не то что учат а как буд то смотришь новости где быстро как из пулемета стреляют словами и пишут код , смотришь и говоришь себе зачем я трачу драгоценное время в пустую.
Хорошие уроки, автору канала респект
Тоха лучший!
Спасибо!
МОЛОДЕЦ.
лучший
отличный контент
Отлично!
while(1)
{
printf("top!");
cout
указатель может занимать 8 байт смотря какая архитектура
Вот только то сколько памяти занимает указатель не постоянная величина, а зависящая от размера компьютерного слова. На системах с разрядностью 32 это, и в правду, 4, а вот когда разрядность 64 размер указателя уже будет 8.
у меня х64, все равно 4
да, это вроде бы называется шиной адреса процессора
@@ART-zp5bh длина машинного слова
Если пытаюсь присвоить что-то нетипизированному указателю, пишет что неприсваиваемый тип войд:
void* a = malloc(sizeof(int));
*a = 13;
Компилятор ругается, так же и при попытке вывести через принтф данные по адресу *a
Прошу заметить что функция free не возвращает бесплатную картошку фри!
Комментарий не имеет никакого смысла, кроме развлекательного, для помощи канала Антона!
Может. Ведь в маллоке может храниться любая информация)
Антон что будет если я укажу меньше байт необходимого указателю, например 2 вместо 4?
Будет большая вероятность получить плавающую ошибку, которую очень трудно найти и исправить. Лучше так не делать)
@@beginend95 Все понял спасибо!
Немогу понять зачем нужно в си работать с кучей(ведь столько много требований синтаксиса с динамической памятью),ведь уже написан си++(где это на много проще) ,который в автоматическом режиме контролирует,что бы не было утечки памяти по неосторожности программиста?
Одно замечание. Новичкам трудно иногда уследить за мыслью при таком темпе изложения.
Ага, особенно когда человек склонен терять концентрацию и задумывается о своём, как я)
-это проблема ученика, а не учителя..?-
А ещё лично я лучше понимаю на картинках и реальных примерах - беря в пример какие-то функции игр, например..
Кстати, для лучшего усвоения можно включить субтитры и/или замедлить скорость и вслушиваться, смотря в пустоту, представляя сказанное, т.к. изображение перед гладит может привлекать внимание и, ну, мешать
Ну.. Или ещё как вариант - остановить воспроизведение, подумать о чём нужно, глубоко подышать (помедитировать, сконцентрироваться) и продолжить xD
С другой стороны.. Если совсем уж никак настроиться - стоит лечь спать и отложить обучение на пробуждение.. 🤔
А почему в девятой строке не выдаёт никаких ошибок? Там должно быть приведение типов (int*) перед функцией malloc . У меня только так сработало.
В языке Си использование указателя void* не требует применения явного преобразования. Возможно ты что-то настраивал в среде.
@@beginend95 Понял. Я в проекте с++ писал, может из-за этого.
Антош, а почему ты не рассказал, что желательно в int main() вписывать в аргументы void, в плюсах понятно, что когда ты оставляешь мейн фукнцию без аргументов это значит, что для функции не разрешены параметры. В практике бывали ворнинги от компилятора, когда main оставался без void
Честно говоря, я про это забыл. Благодарю за замечание)
@@beginend95 рабочие моменты, будешь продолжать плейлист?) Всем, кто будет читать это, вот вам хороший совет: Всегда указывать аргумент void в int main (). Потому что такие компиляторы как clang, amd x86 open64 compiler suite, open watcom, digital mars (dm чаще пишут), часто ругаются за отсутствие void в качестве аргумента в ведущей функции! В плюсах можете об этом забыть, там все лучше
@@cytorak875 Да, в есть планах несколько тем. Но сначала ОпенГЛ, а потом С++.
@@beginend95 понял, спасибо большое) надо будет опенгл посмотреть, не разу не работал с ним
@@ЖораКоваль-е9с вообще да, но как я и написал выше это свойственно лишь некоторым компиляторам, в gcc, icc, clang этого нет не сегодняшний день. Если вы используете какой-то DM, то там это возможно, хотя в настоящий момент этого может и не быть
в 32 разрядной системе указатель занимает 4 байта, в 64 разрядной 8
завтра на 8 разрядном стм 8 запущу , интересно что будет, тк однобайтовый указатель бредово звучит, тк объем оперативки там килобайт)
Привет! И что получилось в итоге? Интересно же :) Спасибо заранее.
"Процедура free, как картошка только процедура."))
Зачем в функцию malloc вставлять метод sizeof, ведь все указатели любого типа занимают 4 байта, почему нельзя просто указать 4?
потому что мы выделяем память не для адреса (указателя), а для ячейки памяти определенного типа, которая хранит значение (например int). Если будет char *c, то нужно будет выделить всего 1 байт. + Нам может понадобиться выделить память для структуры.
sizeof это оператор, а не функция
оператор и есть функция
Почему у меня все равно показывает 8 байт вместо 4?
В 64 разрядных приложениях указатель занимает 8 байт.
В 32 разрядных - 4 байта.
@@beginend95 Спасибо!
Компилятор упорно выдаёт ошибку и отказывается присваивать и выводить значение строке.
Можете подсказать в чем проблема?
char *z = NULL;
z = malloc(sizeof(char));
if ( z != NULL){
*z = "tree";
printf("%s
", *z);
}
Ты выделил память под 1 символ, а поместить туда пытаешься строку
@@MC-hd5ebэто происходит по другой причине. Если выделить необходимый размер памяти, то тоже ошибку выдаст. Один массив в другой только через цикл можно скопировать.
почему на экран выводится 333??? Ведь условие содержит, что на экран вывести 333, если х != NULL. Но ведь int *х = NULL на строке 9!!!
такой же вопрос
Присоединяюсь к вопросу.
Собственно, проблема в том, что последний printf не срабатывает. Если кто знает почему, напишите в ответы пожалуйста.
Код:
#include
#include
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;
*iPtr = %i;
*fPtr = %f;
",*dPtr, *iPtr, *fPtr);
free(dPtr);
free(iPtr);
free(fPtr);
dPtr = NULL;
iPtr = NULL;
fPtr = NULL;
}
if((dPtr = NULL) && (iPtr = NULL) && (fPtr = NULL)){
printf("Success.");
}
}
Я конечно поздно, но вдруг. Вместо 1 знака равно должно быть 2
Комментарий
благодарю за поддержку!)
Комментарий
Комментарий
Комментарий