Это связано с тем, как вызовы функций C и стек работают. Боюсь, это может показаться немного сложным, когда написано.
Сначала указатель p-of-main
размещается в стеке. Затем готовится вызов функции. Для этого все целые значения должны быть скопированы в стек, поэтому копируется значение p-of-main
и выполняется функция f
. Теперь f может видеть только скопированное значение в пространстве аргументов, но это не та же область памяти, что и p-of-main
, это фактически новая «переменная»: p-of-f
.
Чтобы достичь того, что вы хотите сделать, вам действительно нужно передать указатель на указатель (я пометил измененные строки с помощью // !
):
void f(void **p){ // !
*p=malloc(1); // !
printf("%i\n",*p); // !
}
void main(int argc,char *argv[]){
void *p=malloc(1); // !
printf("%i\n",p);
f(&p); // !
printf("%i\n",p);
}