• 函数指针传递


    void GetMemory(char *p, int num)
    {
        p = (char *)malloc(sizeof(char)* num);
        int i = 0;
    }
    
    int main(int argc,char** argv)
    {/*
        char buf1[] = "123";
        aa(buf1);
        */
        char *str = NULL;
        GetMemory(str, 100);
    
        return 0;
    }

    先看这个例子,函数GetMemory明显不能分配内存给str,而且还会造成内存泄漏。

    分析一下过程:

    1.声明并定义str,str地址为0x00000000;

    2.进入函数。把str拷贝给p,即p只是一个str的副本,拥有str的地址值:0x00000000;

    3.malloc开始分配内存,分配成功后,p的地址肯定不是原来的0x00000000,是什么不重要,反正肯定不是str的那个地址了。

    4.函数执行完了,返回。内存必然分配成功,原来的那个p的是指向那块内存的指针,但是并没有赋给str的这一操作,所以str仍然是原来0x00000000.

    char *GetMemory(int num)
    {
        char *p = (char *)malloc(sizeof(char)* num);
        return p;
    }

    看这个函数,main里补一句,char *str=GetMemory(100);

    1.p被定义,分配了一段内存,p指向那段内存。p这个指针在栈上,而那段内存在堆上;

    2.函数返回p,此时拷贝一遍p,即函数产生了一个p的副本,p的地址被返回给str。

    3.恭喜str成功领导了那块内存!

    可以给str鼓掌了!

  • 相关阅读:
    DecimalFormat
    flex 分页
    flex 分页
    算法学习——st表
    [USACO07DEC]美食的食草动物Gourmet Grazers
    [ZJOI2005]沼泽鳄鱼 矩阵乘法
    [SCOI2010]序列操作 线段树
    [LNOI2014]LCA
    [AHOI2013]作业 & Gty的二逼妹子序列 莫队
    Linux相关——关于文件调用
  • 原文地址:https://www.cnblogs.com/wyc199288/p/5568580.html
Copyright © 2020-2023  润新知