func中的内存(重新)分配指针

时间:2011-01-24 14:54:12

标签: c pointers malloc

例如:

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)

7 个答案:

答案 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);
}