Как переопределить указатель Си внутри тела функции

Бывают случаи когда функция должна переопределить переданный ей указатель (void*), но так как переменные попадают в стек, переопределение идет на значение в стеке и совсем не влияет на реальное значение вне тела функции.

<html> <strong style=«color:red;»>!!!</strong> Функция меняющая свои входные параметры является очень плохой практикой программирования, если есть возможность избежать или каким либо образом изменить поведение, то лучше воспользуйтесь им. В конце концов функция может вернуть новый указатель и дать программисту право выбора что он будет с ним делать. </html>

И так вот код, на примере простой строки

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void test_static(int** output) {
    *output = &"Hello World!";
}
 
void test_addr(int** output) {
    char* new_value = calloc(50, sizeof(char));
    strcpy(new_value, "Hello Universe");
    *output = new_value;
}
 
int main() {
    char* buffer = NULL;
    int** buffer_ptr = &buffer;
 
    test_static(buffer_ptr);
    printf("static memory: %s\n", buffer);
 
    test_addr(buffer_ptr);
    printf("Dynamic memory: %s\n", buffer);
    free(buffer); // Не забываем освобождать память! +)
    return 0;
}

Как проделать этот-же финт c ушами на плюсах, можно прочитать на GeeksForGeeks в статье указатель на указатель. На самом деле в плюсах всё это дело оказуалили по полной программе.

https://www.geeksforgeeks.org/passing-reference-to-a-pointer-in-c/