int *tomato(int *a, int *b) {
int *foo = (int*)malloc(sizeof(int));
*foo = *a + *b;
return foo;
}
在这个函数中,我有foo,它在堆中分配并返回一个指向int
的指针,但是函数参数中的指针*a
和*b
也在堆中分配?我在这里有点困惑,一般来说,参数是在堆栈中分配的。
指针是tomato
函数中的局部变量,就像foo
一样。
他们指向的值可以在任何地方分配。例如,你可以像这样调用它:
int foo = 1;
int *bar = malloc(sizeof(int));
*bar = 3;
int *result = tomato(&foo, bar);
a
将指向foo
变量,而b
将指向malloc
分配的内存。
C中的参数不一定在堆栈(*)中分配,但它们的范围必须限制在tomato
功能块中,并且它们必须通过值传递。
当您在赋值a
中取消引用b
和*foo = *a + *b
时,您将存储在指针a
和b
中的内存地址解释为整数,将它们相加,并将结果写入存储在指针foo
中的内存地址(在您的示例中,恰好发生在在堆里)。
在赋值之后,你可以通过为它们分配不同的存储器地址(即指针)来随意改变a
和b
,并且对于任何外部存储器引用都没有任何后果,因为它们的范围仅限于功能块(例如a = foo
)。但是,如果你更改了它们引用的内存内容(例如*a = 0
),那么这将在函数范围之外变得可见,就像你在其他地方分配的内存空间(堆栈或堆)上所写的一样。
(*)参数不能在存储器(即堆栈)中传递给函数。根据编译器/体系结构,它们可以直接分配给处理器寄存器。无论哪种方式,这是一个透明的编译器优化,你不必担心它...参数将表现相同。