Уже этот вопрос задают здесь: двойной указатель против одного указателя
Я следовал инструкциям этого вопроса, но столкнулся с ошибками и все еще не в состоянии точно понять, что происходит в памяти (что указывает на что и как). Ниже приведен код:
#include <stdio.h>
#include <stdlib.h>
void func(int **ptr)
{
*ptr = (int *) malloc (sizeof(int));
**ptr = 10;
printf("Inside func: ptr: %p *ptr: %p **ptr: %p %d\n", ptr, *ptr, **ptr, **ptr);
}
void func2(int *ptr)
{
int i = 10;
ptr = (int *) malloc (sizeof(int));
*ptr = 288;
printf("Inside func2: ptr: %p *ptr: %p %d\n", ptr, *ptr, *ptr);
}
int main()
{
int *a = NULL, *b = NULL;
func(&a);
printf("&a: %p, a: %p, *a: %p *a: %p %d\n", &a, a, *a, *a, *a);
func2(b);
printf("*b: %d\n", *b);
return 0;
}
Вывод:
main.c:8:51: warning: format ‘%p’ expects argument of type ‘void *’, but argument 4 has type ‘int’ [-Wformat=]
main.c:16:42: warning: format ‘%p’ expects argument of type ‘void *’, but argument 3 has type ‘int’ [-Wformat=]
main.c:23:33: warning: format ‘%p’ expects argument of type ‘void *’, but argument 4 has type ‘int’ [-Wformat=]
main.c:23:40: warning: format ‘%p’ expects argument of type ‘void *’, but argument 5 has type ‘int’ [-Wformat=]
Inside func: ptr: 0x7ffcf5c49760 *ptr: 0x22f7010 **ptr: 0xa 10
&a: 0x7ffcf5c49760, a: 0x22f7010, *a: 0xa *a: 0xa 10
Inside func2: ptr: 0x22f7030 *ptr: 0x120 288
Segmentation fault (core dumped)
В шутку c -> когда a & ptr
назначены и указывают на те же области памяти, почему это не может произойти на func2. В любом случае для * ptr я передаю b (который является адресом * b) и изменяю значение.
Невозможно понять, что указывает на что и как. Если кто-то может помочь, буду очень благодарен.
Хотя это повторение уже заданного вопроса, опубликовано, так как ответ недостаточен для меня, чтобы понять. Следовательно, просьба пометить как дубликат, пока на вопрос не будет дан правильный ответ.