2014-10-17 87 views
0

我在這裏做錯了什麼?我是否將內存分配給原始的charPtr或其他東西?爲什麼我可以在func2內讀取charPtr的值,但不能在主(charPtrNULL的主)?通過傳遞兩個函數來分配指針

#include <stdlib.h> 
#include <stdio.h> 
void func2(char *charPtr) 
{ 
     charPtr = (char *)malloc(sizeof(char)); 
     *charPtr = 'c'; 
     printf("func2: %c\n", *charPtr); 
} 

void func1(char** charDoublePointer) 
{ 
     //*charDoublePointer = (char *)malloc(sizeof(char)); 
     func2(*charDoublePointer); 
} 

int main(int argsc, char* argv[]) 
{ 
     char * charPtr = NULL; 
     func1(&charPtr); 

     printf("%c\n", *charPtr); 
} 
+0

在'func2',改變什麼'charPtr'點不是調用函數可見。 – crashmstr 2014-10-17 18:54:59

+2

讀你的頭銜會讓你頭疼。此外,[不要施放malloc(和朋友)]的結果(http://stackoverflow.com/q/605845)。 – Deduplicator 2014-10-17 18:55:19

回答

1

func2需要採取char**就像func1。當你寫:

void func2(char *charPtr) 
{ 
     charPtr = (char *)malloc(sizeof(char)); 
     *charPtr = 'c'; 
     printf("func2: %c\n", *charPtr); 
} 

你只是分配局部變量charPtr,這對外界程序沒有任何影響。相反,寫:

void func2(char **charPtr) 
{ 
     *charPtr = malloc(sizeof(char)); //don't cast result of malloc 
     **charPtr = 'c'; 
     printf("func2: %c\n", **charPtr); 
} 

如果您堅持更改名稱爲charDoublePtr

而像調用它func1

func2(charPtr); 
+1

更好的是:使用返回值而不是出參數。 – Deduplicator 2014-10-17 19:09:21

1

函數func2獲取原始指針的副本。這是functioon的參數func2是一個局部變量,在退出函數後會被銷燬。

void func2(char *charPtr); 

您可以定義的功能你錯過了一個間接層以下方式

char * func2() 
{ 
     char * charPtr = (char *)malloc(sizeof(char)); 
     *charPtr = 'c'; 
     printf("func2: %c\n", *charPtr); 

     return charPtr; 
} 

void func1(char** charDoublePointer) 
{ 
     //*charDoublePointer = (char *)malloc(sizeof(char)); 
     *charDoublePointer = func2(); 
}