Обратите внимание, что второй аргумент в memset
должен быть байтом, то есть он неявно приводится к char
или подобному. 0xDEADBEEF
для большинства платформ конвертируется в 0xEF
(и что-то еще для какой-то странной платформы).
Также обратите внимание, что второй аргумент должен формально быть int
, который NULL
не является.
Теперь для преимущества выполнения такого рода инициализации. Во-первых, поведение, скорее всего, будет более детерминированным (даже если в результате мы получим неопределенное поведение, поведение на практике будет последовательным).
Наличие детерминированного поведения будет означать, что отладка станет проще, когда вы найдете ошибку, вам «придется» предоставить тот же вход, и ошибка проявится.
Теперь, когда вы выбираете, какое значение вы будете использовать, вы должны выбрать значение, которое, скорее всего, приведет к плохому поведению - что означает, что использование неинициализированных данных с большей вероятностью приведет к обнаружению ошибки. Это означает, что вам придется использовать некоторые знания о рассматриваемой платформе (однако многие из них ведут себя очень похоже).
Если память используется для хранения указателей, то, действительно, очистка памяти будет означать, что вы получите указатель NULL
и, как правило, разыменование, которое приведет к ошибке сегментации (которая будет рассматриваться как ошибка). Однако, если вы используете его по-другому, например, как арифметический тип, вы получите 0
, а для многих приложений это не то нечетное число.
Если вместо этого вы используете 0xDEADBEEF
, вы получите довольно большое целое число, также при интерпретации данных как с плавающей запятой это также будет довольно большое число (IIRC). Если интерпретировать его как текст, он будет очень длинным и содержать символы, отличные от ascii, и если вы используете кодировку UTF-8, он, вероятно, будет недействительным. Теперь, если его использовать в качестве указателя на какой-либо платформе, он будет не соответствовать требованиям выравнивания для некоторых типов - также на некоторых платформах эта область памяти может быть в любом случае отображена (обратите внимание, что на x86_64 значение указателя будет 0xDEADBEEFDEADBEEF
, что вне диапазон для адреса).
Обратите внимание, что при заполнении 0xEF
будут очень похожи свойства, если вы хотите заполнить память 0xDEADBEEF
, вам нужно будет использовать пользовательскую функцию, так как memset
не справляется с задачей.