例如:
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);
}
会产生这样的东西:
5513696
5513728
5513696
为什么通过地址和分配不会改变指针地址? 附:哪里可以像realloc(甚至可以通过recusrive函数调用递归realloc)
答案 0 :(得分:3)
当您将指针传递给正在按值复制的函数时,因此您将指定一个不同的指针,该指针在您进行malloced之前指向与原始位置相同的位置。
答案 1 :(得分:2)
因为您按地址传递已分配的内存,但实际上是按值传递指针。
这是你在那里改变的指针,但由于它是按值传递的,所以当你离开函数时,这种改变不会反映出来。
如果你想改变指针,你必须传递另一个指向 it 的指针,如:
#include <stdio.h>
#include <stdlib.h>
void f (void **p){
// free (*p); // add in to avoid memory leak
*p = malloc (1);
printf ("%i\n", *p);
}
int main (int argc, char *argv[]){
void *p = malloc (1);
printf ("%i\n", p);
f (&p);
printf ("%i\n", p);
return 0;
}
输出:
6750728
6816336
6816336
正如我所预期的那样。
答案 2 :(得分:1)
当你调用p
时,它会收到一个指针的副本(“按值传递”),该函数在函数返回时被丢弃。你可以改为传递指针地址。
void f(void** p){
*p= ... whatever you want
}
答案 3 :(得分:1)
你应该这样做:
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);
}
答案 4 :(得分:0)
当您将指针作为参数传递给函数时,会创建一个指向内存中相同位置的新指针。
答案 5 :(得分:0)
正如其他人所指出的那样,你是按值传递指针。如果你想(重新)在函数中分配一个指针,通过引用传递它,如下所示:
void f(void *& p)
答案 6 :(得分:0)
这与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);
}