传递指针作为参数

问题描述 投票:-1回答:2
int *tomato(int *a, int *b) {
    int *foo = (int*)malloc(sizeof(int));
    *foo = *a + *b;
    return foo;
}

在这个函数中,我有foo,它在堆中分配并返回一个指向int的指针,但是函数参数中的指针*a*b也在堆中分配?我在这里有点困惑,一般来说,参数是在堆栈中分配的。

c pointers stack heap
2个回答
3
投票

指针是tomato函数中的局部变量,就像foo一样。

他们指向的值可以在任何地方分配。例如,你可以像这样调用它:

int foo = 1;
int *bar = malloc(sizeof(int));
*bar = 3;
int *result = tomato(&foo, bar);

a将指向foo变量,而b将指向malloc分配的内存。


1
投票

C中的参数不一定在堆栈(*)中分配,但它们的范围必须限制在tomato功能块中,并且它们必须通过值传递。

当您在赋值a中取消引用b*foo = *a + *b时,您将存储在指针ab中的内存地址解释为整数,将它们相加,并将结果写入存储在指针foo中的内存地址(在您的示例中,恰好发生在在堆里)。

在赋值之后,你可以通过为它们分配不同的存储器地址(即指针)来随意改变ab,并且对于任何外部存储器引用都没有任何后果,因为它们的范围仅限于功能块(例如a = foo)。但是,如果你更改了它们引用的内存内容(例如*a = 0),那么这将在函数范围之外变得可见,就像你在其他地方分配的内存空间(堆栈或堆)上所写的一样。

(*)参数不能在存储器(即堆栈)中传递给函数。根据编译器/体系结构,它们可以直接分配给处理器寄存器。无论哪种方式,这是一个透明的编译器优化,你不必担心它...参数将表现相同。

© www.soinside.com 2019 - 2024. All rights reserved.