2011-01-24 52 views
0

例如:內存(重新)FUNC內的指針分配

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 

爲什麼按地址傳遞和分配不會改變指針地址? p.s.在那裏可以像realloc(甚至通過recusrive函數調用遞歸realloc)

+1

爲側節點,主要應始終返回東西,因此int main()並返回 – 2011-01-24 14:58:13

回答

2

因爲你路過地址分配的內存,但你實際上是按值傳遞的指針

它是你在那裏改變的指針,但是,由於它是通過值傳遞的,所以當你離開函數時不會反映這個改變。

如果你想改變指針,你有另一個指針傳遞給,如:

#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 

3

當你傳遞一個函數的指針,你正在按值複製,因此你分配一個不同的指針,直到你malloced,指向與原始地點相同的地方。

1

如果您撥打p,它會收到一個指針(「按值傳遞」)的副本,該指針在函數返回時被丟棄。您可以改爲傳遞指針地址。

void f(void** p){ 
    *p= ... whatever you want 
} 
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); 
} 
0

當你傳遞一個指針作爲參數傳遞給函數創建一個新的指針指向內存中的相同位置。

0

正如其他人指出的那樣,您正在按值傳遞指針。如果你想(重新)在功能分配的指針,通過引用傳遞它像這樣:

void f(void *& p) 
+1

C中沒有引用 – 2011-01-24 15:09:12

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