通过将指针传递给两个函数来分配指针

时间:2014-10-17 18:52:19

标签: c pointers malloc double-pointer

我在这里做错了什么?我是否将内存分配给原始charPtr或其他内容?为什么我可以在charPtr中读取func2的值,而不是主要的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);
}

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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);