Вы всегда передаете указатель на указатель по значению, заставляя его казаться единым указателем, когда вы назначаете его себе и когда вы передаете его функции; это работает только потому, что вы указали указатель на себя.
То, что вы делаете, в основном так:
void foo(void **p)
{
*p = "hahaha";
}
int main(int argc,char **argv)
{
void *p = NULL;
printf("%p\n", &p);
foo(&p);
printf("%s\n",(char *)p); // hahaha
printf("%p\n", p);
return 0;
}
с некоторыми добавками и трюками. «Трюки с картами в темноте», я бы сказал, и определенно не очень хорошая идея, чтобы использовать настоящую программу.
Чтобы действительно ответить на вопрос: да, он должен быть переносимым, потому что стандарт гарантирует, что каждый указатель данных может быть без проблем приведен к void *
и обратно (это то, что вы делаете в своем коде все время) :
Указатель на void
может быть преобразован в или из указателя на любой незавершенный объект или объект
тип. Указатель на любой неполный объект или тип объекта может быть преобразован в указатель на void
и обратно снова; результат должен сравниться с исходным указателем.
(C99, §6.3.2.3.1)