zoukankan      html  css  js  c++  java
  • C/C++内存知识(三)

    C/C++内存知识(三)

    指针参数是如何传递内存的?

    如果函数的参数是一个指针,不要指望用该指针去申请动态内存。

    函数的语句GetMemory(str, 200)并没有使str 获得期望的内存,str 依旧是NULL,为什么?

    void GetMemory(char *p, int num)

    {

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

    }

    void Test(void)

    {

      char *str = NULL;

      GetMemory(str, 100); // str is still NULL still

     

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

    }

    毛病出在函数GetMemory 中。编译器总是要为函数的每个参数制作临时副本,指针参数p 的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p 的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。

    在本例中,_p 申请了新的内存,只是把_p 所指的内存地址改变了,但是p 丝毫未变。所以函数GetMemory 并不能输出任何东西。事实上,每执行一次GetMemory 就会泄露一块内存,因为没有用free 释放内存。

    如果非得要用指针参数去申请内存,那么应该改用"

    指向指针的指针".

    由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。

    用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把

    return 语句用错了。

    这里强调不要用return 语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡.

    eg:

    char *GetString(void)

    {

      char p[] = "hello world";

      return p; // 编译器将提出警告

    }

    void Test4(void)

    {

      char *str = NULL;

      str = GetString(); // str 的内容是垃圾

      cout<< str << endl;

    }

  • 相关阅读:
    LeetCode OJ String to Integer (atoi) 字符串转数字
    HDU 1005 Number Sequence(AC代码)
    HDU 1004 Let the Balloon Rise(AC代码)
    HDU 1003 Max Sum(AC代码)
    012 Integer to Roman 整数转换成罗马数字
    011 Container With Most Water 盛最多水的容器
    010 Regular Expression Matching 正则表达式匹配
    007 Reverse Integer 旋转整数
    006 ZigZag Conversion
    005 Longest Palindromic Substring 最长回文子串
  • 原文地址:https://www.cnblogs.com/vedgtar/p/2204009.html
Copyright © 2011-2022 走看看