Тип void* и интерпретация данных

  Рет қаралды 40,646

Тимофей Хирьянов

Тимофей Хирьянов

Күн бұрын

Пікірлер: 38
@AlexPapanov
@AlexPapanov 5 жыл бұрын
Белой завистью завидую Вашим студентам. Вы преподаватель от Бога, Тимофей.
@mkzlodeev
@mkzlodeev 6 жыл бұрын
Лучшие лекции по Си, спасибо большое за труды!
@beginend95
@beginend95 4 жыл бұрын
Огромное спасибо! Все очень понятно!)
@aleksproger_il
@aleksproger_il 8 ай бұрын
Я смотрю твои уроки. Спасибо большое!
@1nfoGames
@1nfoGames 3 жыл бұрын
Ваааах, месяц назад смотрел, было ничего не понятно. Удивительно... сейчас все понял)
@bekbolotibraimovmrx5412
@bekbolotibraimovmrx5412 4 жыл бұрын
Вы рождены быть обучателем программных языков!Супер!
@MrYsupov
@MrYsupov 4 жыл бұрын
"На самом интересном месте!"
@safaraliabduazimov7387
@safaraliabduazimov7387 3 жыл бұрын
Огромное Спасибо за урок!!!
@Piter_Pain
@Piter_Pain 5 жыл бұрын
Кино обрывается на полуслове. Пустячок, но огорчительно.
@muxach6277
@muxach6277 6 жыл бұрын
Отличная лекция)) С нетерпением жду лекцию о том, как создавать новый поток внутри класса и убивать его в деструкторе класса.
@programer8
@programer8 4 жыл бұрын
Вы сказали что адрес не зависим от того на что он указывает. Вот что показывает следующий вывод: printf("sizeof of char* = %d ", sizeof(char*)); printf("sizeof of int* = %d ", sizeof(int*)); printf("sizeof of double* = %d ", sizeof(double*)); везде значение 4
@alexanderkhoroshavin6921
@alexanderkhoroshavin6921 4 жыл бұрын
На 32-битной системе 4 байта, на 64-битной 8 байт
@programer8
@programer8 4 жыл бұрын
@@alexanderkhoroshavin6921 да и думаю можно понимать почему. Адреса ведь нумерируются целочислеными значениями, а целочисленные значения по умолчанию имеют тип int. int занимает одно машинное слово, а размер машинного слова зависит от архитектуры процессора. Вот поэтому и выходит что на 32-битной системе 4 байта, а на 64-битной 8 байт. Вот такая цепочка получилось :d
@billjohnes9380
@billjohnes9380 3 жыл бұрын
@@programer8, а почему для адресов должен использоваться "тип по умолчанию целочисленных значений"? Если смотреть особенности кода, генерируемого компиляторами, то видно, что сами адреса ведут себя как беззнаковые значения. При этом их разность ведёт себя как знаковый тип (который стандартизован и называется ptrdiff_t). Такой, вот, парадокс, но это так. И тип по умолчанию целочисленного литерала, даже при отсутствии суффикса, зависит как от значения этого самого литерала, так и от используемого основания системы счисления. Он может быть и unsigned int, и long и так далее: en.cppreference.com/w/c/language/integer_constant#The_type_of_the_integer_constant. Дословно: "The type of the integer constant is the first type in which the value can fit, from the list of types which depends on which numeric base and which integer-suffix was used". В таблице первая строка для случая отсутствия суффикса, то есть, для обсуждаемого случая. Но это так, отступление. Что здесь очень важно: тип int может оказаться слишком мал для хранения адреса, адрес может в него не поместиться. В скольких программах видно, что "программист" думал, что указатель там поместится, и при смене платформы это всё повылезало... Если сильно надо, существуют специальные типы intptr_t и беззнаковый uintptr_t, однако они optional, и не во всех реализациях могут присутствовать. Поэтому всякие попытки хранить указатели в интегральных типах следует отложить на далёкое будущее. Но данный преподаватель о подобных вещах вряд ли расскажет. Ему и в голову не пришло, что, кроме адресов переменных c, i и d, в p можно было также положить и адрес самого p, хотя искушённому программисту, демонстрирующему указатель на void, такое в голову сразу придёт (программировать не только трудно, но и, бывает, прикольно). И, естественно, в данном ролике ни слова о неявном приведении как к void *, так и обратно, поэтому обученные таким преподаванием люди будут загромождать код явными приведениями...
@ozimandias1738
@ozimandias1738 Жыл бұрын
Хорошее видео. Однако type_marker лучше через switch обрабатывать.
@ESEben10
@ESEben10 5 жыл бұрын
Спасибо!
@MrAlexT92
@MrAlexT92 6 жыл бұрын
Вот это привалило инфы по Си. Чувствую Тимофей Хирьянович скоро сниться начнет от того что всё свободное время посвящаю просмотру лекций
@enikeev_tg
@enikeev_tg 2 жыл бұрын
Функция exit() не из той же серии, что и goto? Часто её в своём коде программисты используют?
@juvusart
@juvusart 2 жыл бұрын
Не часто. Обычно стараются как-то поймать исключение, обработать. Открытые потоки закрыть, память освободить и т.д. Exit с кодом ошибки - это крайне жёсткий вариант аварийного завершения работы. Равносильно Ctrl-Alt-Del и там закрыть процесс. Часто ты так завершаешь работу запущенных программ?
@wingedrainbow
@wingedrainbow 2 жыл бұрын
Как пример применения из bpf. ``` vim kernel/bpf/inode.c ... enum bpf_type { BPF_TYPE_UNSPEC = 0, BPF_TYPE_PROG, BPF_TYPE_MAP, }; static void *bpf_any_get(void *raw, enum bpf_type type) { switch (type) { case BPF_TYPE_PROG: raw = bpf_prog_inc(raw); break; case BPF_TYPE_MAP: raw = bpf_map_inc(raw, true); break; default: WARN_ON_ONCE(1); break; } return raw; } ```
@peaceduke1973
@peaceduke1973 Жыл бұрын
void это же процедура? функция без return? вов всяком случае я так думал. Но надо теперь еще подумать.))
@billjohnes9380
@billjohnes9380 3 жыл бұрын
Жесть. Тип void -- не пустой, а incomplete, как, скажем, и тип структуры после её forward-декларации. Incomplete-тип характеризуется тем, что для него неизвестен ни размер, ни выравнивание, поэтому-то и нельзя сгенерировать код разыменования указателя на него. Почему бы об этом не рассказать, чтобы студент понимал суть, а не слепо верил в какой-то непонятный несуществующий "пустой тип"? В этом смысле void и структура, для которой в данном месте кода существует лишь forward-декларация, ничем не отличаются. Совсем ничем. Только структуру далее по коду можно доопределить, и её тип с этого момента становится завершённым, становится известными размер и выравнивание значений этого типа, и указатели на такие типы становится возможным разыменовывать, даже те, которые были объявлены выше по коду, в момент, когда структура ещё не была доопределена и имела incomplete-тип. И это будет понято студентами, поскольку они будут знать, что дело лишь в наличии необходимой информации у компилятора для генерации кода в момент этой генерации при разыменовании, а не при создании указателя. Тип же void невозможно "завершить" в принципе, его размер и выравнивание поэтому не могут быть известны в принципе, и поэтому разыменование указателей на void также невозможно в принципе, потому что неясно, какой код компилятору под это генерировать, раз размер и выравнивание значения не известны. Какой образчик программы даётся: то, что сюда прямо "рвётся" switch, а не портянка if else не "чувствуем", используем неведомые единички и прочие двоечки с троечками, создаётся впечатление, что про enum и не слышали... Второстепенная функция принимает решения, типа завершения программы, на которые она в принципе права не может иметь... А потом появляются соискатели, нашпигованные такими практиками, и которых приходится переучивать. Они не знают, в том числе, что в pure C существует неявное приведение как к void *, так и обратно, потому что в лекциях ничего такого не было, и "лепят" везде явное приведение, загромождая программу... И появляются библиотеки, функции которых, вместо того, чтобы вернуть код ошибки, пишут "shit happens" (жесть) и вызывают функцию abort (особо циничная жесть, ещё жестянее уже трудно придумать), которая грубо завершает программу (реальный случай)... Преподаватели должны быть в существенной степени практикующими программистами на преподаваемом языке, иначе вся эта жесть продолжится и дальше...
@femlemp
@femlemp 3 жыл бұрын
Спасибо чел, реально пояснительно, но начав смотреть лекции не имея базу я бы тебя не понял, откуда ты берёшь эту информацию? Стандарт ansi c?
@epsilon.sw_
@epsilon.sw_ 2 ай бұрын
Мне не кажется, что кто-то воспринял слова про пустой тип буквально. Ну это просто название такое. А что он "делает" "пустой тип" видно на примере.
@billjohnes9380
@billjohnes9380 2 ай бұрын
@@epsilon.sw_ Когда говнокод глючит, и программы падают, мне это совсем не кажется, это на самом деле происходит. Очевидно, что C -- не ваш язык, если вы не видите разницы даже после подробнейшего объяснения мной сути вопроса.
@nicholasspezza9449
@nicholasspezza9449 10 ай бұрын
не дубль вэ, а дабл ю!☝
@pustpokazivaet8277
@pustpokazivaet8277 5 жыл бұрын
Здравствуйте уважаемый Тимофей Хирьянов, у вас будут видео об структурах и указатели на структуры на Си?
@vip51000
@vip51000 4 жыл бұрын
Я думаю этот курс является завершенным
@pustpokazivaet8277
@pustpokazivaet8277 4 жыл бұрын
@@vip51000 скорее всего ! спасибо!
@igorseledtsov7345
@igorseledtsov7345 3 жыл бұрын
формат для double f а не lf, а вот для scanf всё именно так как написано. Нелогично, но это так.
@RageonGames
@RageonGames Жыл бұрын
Тогда говори уж полностью, что f валиден для дабла, начиная с C99, а ниже, в C89 например это ошибка
@JingoBo
@JingoBo 5 жыл бұрын
Не рассказал про опасность разыменовывания по не выровненным адресам многобайтовых чисел.
@juvusart
@juvusart 2 жыл бұрын
Ну так-то тебе тоже в первом классе говорят, что земля в форме шара, а уж потом в университете, ты возможно узнаешь, что на самом деле в форме геоида.
@igorseledtsov7345
@igorseledtsov7345 3 жыл бұрын
по стандарту double это 54 бита а не 8 байт.. Понятно что когда байт 8 битный это одно и то-же но всё же это не это не одно и то-же
@ill4374
@ill4374 2 жыл бұрын
Где вы такой стандарт нашли?
@igorseledtsov7345
@igorseledtsov7345 2 жыл бұрын
@@ill4374 в документауии языка... прям вот брал и читал и да конечно не 54 а 64
@bogdanz5810
@bogdanz5810 3 жыл бұрын
Что с микро, лучше бы на диктофон в телефоне запись велась, чем так
@epsilon.sw_
@epsilon.sw_ 2 ай бұрын
слушабельно, значит нормально
Передача адреса переменной в функцию в Си
10:44
Тимофей Хирьянов
Рет қаралды 36 М.
Адреса и указатели в Си. Адресная арифметика
27:47
Тимофей Хирьянов
Рет қаралды 166 М.
Hoodie gets wicked makeover! 😲
00:47
Justin Flom
Рет қаралды 135 МЛН
How to Fight a Gross Man 😡
00:19
Alan Chikin Chow
Рет қаралды 13 МЛН
Как Я Брата ОБМАНУЛ (смешное видео, прикол, юмор, поржать)
00:59
Натурал Альбертович
Рет қаралды 3,8 МЛН
كم بصير عمركم عام ٢٠٢٥😍 #shorts #hasanandnour
00:27
hasan and nour shorts
Рет қаралды 10 МЛН
why do void* pointers even exist?
8:17
Low Level
Рет қаралды 387 М.
Выделение и освобождение динамической памяти в Си
27:39
Двумерные массивы в Си: обычные и динамические
21:49
Тимофей Хирьянов
Рет қаралды 74 М.
Введение в язык программирования Go
1:36:18
Computer Science Center
Рет қаралды 90 М.
Ошибки и предупреждения при компиляции на Си
18:15
Тимофей Хирьянов
Рет қаралды 98 М.
Hoodie gets wicked makeover! 😲
00:47
Justin Flom
Рет қаралды 135 МЛН