works:programmer:cpp:pointer-of-pointer

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

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

!!! Функция меняющая свои входные параметры является очень плохой практикой программирования, если есть возможность избежать или каким либо образом изменить поведение, то лучше воспользуйтесь им. В конце концов функция может вернуть новый указатель и дать программисту право выбора что он будет с ним делать.

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

#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/

works/programmer/cpp/pointer-of-pointer.txt · Last modified: 2021/12/05 03:04 by Chugreev Eugene