Это полностью зависит от реализации malloc
.Не существует внутренней причины, по которой конкретная реализация malloc
могла бы вводить недетерминированность (за исключением, возможно, в виде нечеткого теста приложения, но даже тогда он должен быть отключен по умолчанию).Например, Doug Lea's malloc
не использует rand(3)
или каких-либо аналогичных методов в нем.
Но, поскольку malloc
выполняет вызовы ядра, такие как sbrk(2)
или mmap(2)
в Linux или VirtualAlloc
в Windows, эти системные вызовы не всегда могут быть детерминированными, даже в иных идентичных процессах.Ядро может решить намеренно предоставить разные mmap
'ed-адреса в разных процессах по любой причине.
Так что для небольших распределений, которые обычно обслуживаются в пространстве пользователя без системного вызова, вполне вероятно, чтослучай, когда результирующие указатели будут такими же после fork()
;большие выделения, которые обслуживаются системой вызова, могут быть одинаковыми.
В целом, тем не менее, не зависят от этого.Если вам действительно нужны идентичные указатели в отдельных процессах, либо создайте их перед разветвлением, либо используйте разделяемую память и делите их соответствующим образом.