2014-10-17 74 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(); 
}