为什么指针;“忘了吧”;尽管指向malloc';记忆

为什么指针;“忘了吧”;尽管指向malloc';记忆,c,pointers,C,Pointers,将打印输出 void init(int *a) { int *b = malloc(sizeof(int)); *b = 4; a = b; printf("b address %d\n", b); printf("a address %d\n", a); printf("%d\n",*a); } int main() { int *a = malloc(sizeof(int)); printf("a address %d\n",

将打印输出

void init(int *a) {
    int *b = malloc(sizeof(int));
    *b = 4;
    a = b;
    printf("b address %d\n", b);
    printf("a address %d\n", a);
    printf("%d\n",*a);
}

int main()
{
    int *a = malloc(sizeof(int));
    printf("a address %d\n", a);
    init(a);
    printf("a address %d", a);

    return 0;
}
这里,init函数正在初始化
a
的值。然而,这样做是不正确的,我正在试图确定原因。注意,一旦init函数结束,指针
a
就会忘记它应该指向的地址。我假设这与
a
设置为
b
有关,这是一个指针,一旦函数结束就会从堆栈中弹出


但这为什么有意义呢?
a
不应该记得它被设置为什么内存地址吗?毕竟,
a
的范围是主函数,而不是init函数。

函数
init
中的
a
main
中的
a
是不同的对象。调用
init(a)
仅将
a
的值传递给函数。该值只是main中
a
中值的副本。
init
函数没有收到对
main

a
的任何引用作为旁注,您必须使用
%p
来打印指针。@KenY-N:作为旁注,C标准是自愿的,没有规定任何人必须做任何事情。在这方面,C标准只说它没有定义传递
%d
指针时的行为。它并没有说你不能这样做。在这种特殊情况下,这不是一个有用的区别,但它是一个需要理解的重要哲学,因为C标准定义的内容和您可以做的事情之间的区域是实现特定于C的扩展的地方。一旦你们指出这一点,很明显,但一开始我很困惑,因为我倾向于把函数看作是修改输入以产生输出的机器,但实际上它们修改了输入的副本。这个答案也让我意识到为什么将指针作为参数而不是它们指向的结构来运行是更好的做法。(节省复制参数的时间)
a address 32206864
b address 32211008
a address 32211008
4
a address 32206864