Поскольку вы хотите получить значение указателя назад из операций, выполненных в функции. malloc
выделяет память и дает адрес для этой памяти.
В первом примере вы сохраняете этот адрес в локальной переменной-аргументе p
, но, поскольку это всего лишь аргумент, он не возвращается в основную программу, поскольку C / C ++ pass- по умолчанию по умолчанию - даже для указателей.
Main Function malloc
p p allocated
+---+ +---+
| 0 | | 0 | A
+---+ +---+
becomes...
p p allocated
+---+ +---+
| 0 | | ------------> A
+---+ +---+
и, таким образом, когда main читает p, он получает 0, а не A.
В вашем рабочем коде вы следите за указателем, переданным на адрес, и этот адрес дает вам местоположение переменной указателя в основной программе. Вы обновляете значение указателя по этому адресу, который основная программа затем может найти значение, чтобы использовать в качестве места в своей памяти - таким образом передавая адрес, возвращенный malloc
обратно в основную программу для использования.
Main Function malloc
p p allocated
+---+ +---+
| 0 |<------- | A
| | | |
+---+ +---+
becomes...
p p allocated
+---+ +---+
| |<------- |
| ----------------------> A
+---+ +---+
и, таким образом, когда main читает p, он получает A.