• C语言动态内存分配


    考虑下面三段代码:

    片段1

    void GetMemory(char *p)
    {
    p = (char *)malloc(100);
    }
    void Test(void)
    {
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
    free(str);
    }

    片段2

    char *GetMemory(void)
    {
    char p[ ] = "hello world";
    return p;
    }
    void Test(void)
    {
    char *str = NULL;
    str = GetMemory();
    printf(str);
    }

    片段3

    void GetMemory(char **p, int num)
    {
        *p = (char *) malloc(num);
    }
    
    void Test(void)
    {
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello world");
    printf(str);
    }

    在执行代码:

    int main()
    {
    
        Test();
    
        return 0;
    }

    上面三个片段中,1和2根本无法得到正确的结果。片段1甚至会引发程序崩溃!!!

    阅读了林锐博士《高质量C/C++编程指南》,在内存管理方面发现确实有很多说道。。。

    片段一中,Test 函数的语句 GetMemory(str, 200) 并没有使 str 获得期望的内存, str 依旧是 NULL。

    毛病出在函数 GetMemory 中。编译器总是要为函数的每个参数制作临时副本,指针参数 p 的副本是_p ,编译器使_p = p 。如果函数体内的程序修改了_p 的内容,就导致参数 p 的内容作相应的修改。如果非得要用指针参数去申请内存, 那么应该改用 “指向指针的指针!!!!


    片段2的错误显而易见,不能return 指向栈内容的指针!

  • 相关阅读:
    Android 禁止软键盘自动弹出
    Android之Adapter用法总结
    如何成为android高手
    最强大的文案策略
    外贸电商的ERP有很多
    ERP行业销售如何挖掘潜在客户?
    新制造
    C#实现字符串相似度算法
    cmd
    对于大型公司项目平台选择j2ee的几层认识
  • 原文地址:https://www.cnblogs.com/fangying7/p/3788559.html
Copyright © 2020-2023  润新知