Вторая функция не может изменить указатель (int***
), который вы передаете в него, но когда вы сделаете выделение, вы получите новый адрес памяти.Этот новый адрес будет назначен локальной копии указателя внутри myfunc
, но он никогда не достигнет main
.
Следствием этого является то, что вы будете:
- Используйте недопустимый указатель внутри
main
- Утечка памяти, выделенной внутри
myfunc
.
Вы можете уменьшить это, взяв указатель науказатель (вот так!):
// #includes
void myfunc(int****);
int main()
{
int ***a; // <-- note: you had a typo here, originally!
//allocate memory for array 'a'
myfunc(&a); // <-- pass pointer by pointer
// display all contents of array 'a'
return 0;
}
и убедитесь, что myfunc
умен в этом.
Приведенный выше код можно сделать более понятным с помощью typedef
:
// #includes
typedef int*** Ptr;
void myfunc(Ptr*);
int main()
{
Ptr a;
//allocate memory for array 'a'
myfunc(&a); // <-- pass pointer by pointer
// display all contents of array 'a'
return 0;
}
Тем не менее, ваш первый подход намного чище и избавляет от необходимости в этой чепухе.Он просто возвращает новое значение для указателя, который затем можно назначить и использовать по своему усмотрению.
Редактировать (ответ на важный вопрос редактирования)
Я понял, что выделение памяти было сделано в myfunc
;Теперь я вижу, что это не так.
Поэтому вы можете использовать любой из двух методов, которые вы перечислили (или третий, который я описал выше);и, честно говоря, я не понимаю, почему вы будете беспокоиться о первом, поскольку вы не будете изменять указатель внутри myfunc
.