• C++指针内存


    这是一个关于C++指针的问题,思考了一下

    void GetMemory(char *p, int num){

      p = (char*) malloc (sizeof(char) * num);

    }

    void Test(void) {

      char *str = NULL;

      GetMemory(str,100);//str 仍为NULL 

      strcpy(str, "hello");  //运行错误

    }

    这个p等同于指针值传递,只是将p的值传递进去,然后申请内存

    编译器会为函数每个参数制作临时副本,p的副本_p = p;

    如果函数体修改了_p的内容,就导致p的内容也相应修改。

    如果不修改_p,p也不变。反而每执行一次就泄露一块内存。

    void GetMemory2(char **p, int num){

      *p = (char*)malloc(sizeof(char) * num);

    }

    void Test2(void){

      char *str = NULL;

      GetMemory(&str,100);//参数是&tr

      strcpy(str,"hello");

      cout<<str<<endl;

      free(str);

    }

    这是使用指向指针的指针来申请内存的,理解参考:http://www.cnblogs.com/dzry/archive/2011/05/12/2044835.html

    这里p相当于指向了str,p申请了内存就相当于str申请了内存,个人觉得有点难理解

    char *GetMemory3(int num){

      char *p = (char*)malloc(sizeof(char) * num);

      return p;

    }

    void Test3(void){

      char *str = NULL;

      str = GetMemory3(100);

      strcpy(str,"hello");

      cout<<str<<endl;

      free(str);

    }

    这个就是在堆中申请了一段内存,然后返回给str,对于堆,栈,静态区的理解参考:http://my.oschina.net/liangtee/blog/126728

    在GetMemory3中free(P)后,程序还是可以运行的,所以个人觉得free()释放内存是程序运行解释之后的,而不是马上就在函数运行是释放

    参考:http://www.bccn.net/Article/kfyy/cyy/jszl/200608/4238_2.html

    char *GetString(void){

      char p[] = "hello world";

      return p;//编译器出错

    }

    void Test4(void){

      char *str = NULL;

      str = GetString();//乱码

      cout<<str<<endl;

    }

    返回的p被系统回收了,所以是野指针。因为这里是栈申请的存储空间。

    char *GetString2(void){

      char *p = "hello world";

      return p;

    }

    void Test5(void){

      char *str = NULL;

      str = GetString2();

      cout<<str<<endl;//输出hello world

    }

    p申请的是字符串常量,所以指针不变。  

    对指针又加深了一点点了解

    参考于: C++高质量编程指南

  • 相关阅读:
    一元2次方程求解
    react-native 相对项目路径导入组件
    appium页面元素封装(十一)
    pytest高级用法,跳过、失败函数,函数数据参数化(十)
    python之自定义分页代码模板
    pytest高级用法,参数、函数、自动、返回值引用(九)
    pytest.ini文件配置
    因安装pytest最新版本导致,运行pytest命令出错:pluggy.manager.PluginValidationError: unknown hook 'pytest_namespace' in plugin <module 'allure.pytest_plugin' from 'd:\anaconda3\lib\site-packages\allure\pytest_plug
    pytest的使用(八)
    运行pytest,提示编码错误
  • 原文地址:https://www.cnblogs.com/george-cw/p/3629743.html
Copyright © 2020-2023  润新知