Как переопределить указатель Си внутри тела функции
Бывают случаи когда функция должна переопределить переданный ей указатель (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/