• malloc 不能返回动态内存


    关于malloc的理解:

    #include <stdio.h>
    #include <stdlib.h>
    void getmemory(char *p)
    {
      p=(char *) malloc(100);
      strcpy(p,"hello world");
    }
    int main( )
    {
      char *str=NULL;
      getmemory(str);
      printf("%s/n",str);
      free(str);
      return 0;
    }
    

    程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险。

    当参数是指针时容易忽略,请不要用值传递(这样会导致str没有指向分配到的内存),C语言里没有引用的话就用指针传。
    C语言是值传递,故在函数调用中修改的值,并不会返传至主调函数。所以原程序在getmemory函数中malloc获得的地址空间的首地址的值只在函数内部有效,函数调用结束后该值就丢失了

    传值是把实参的值拷贝给形参,运算中是对形参进行操作,实参的值在运算中不会发生变化
    传址是把实参的地址传给形参,运算中是对实参进行操作,会改变实参的值

    此段代码有错,getmemory(str)中参数问题。编译器会为每个函数的参数都复制一份临时副本,指针参数 p 的副本在C中是_p,并且对_p赋值为p ,即 _p = p 。如果在getmemory函数体内修改了 _p 所指向的内容,则导致参数 p 所指向的内容做相应的修改,这就是指针可用作输出参数的原因。但此处中getmemory 函数的 _p 申请了新内存,此时 _p 所指的内存地址改变了,但是 p 没变。所以每次调用getmemory都会造成内存泄露。形参p的域只在函数里有效,p一开始指向你想要的地址,但是当你重新分配内存的时候p指向了新的地址,当你返回函数的时候原来的地址还是空的。要在函数里返回内存有两种办法,一种是指针的指针 **p ,用这个指针指向一个需要分配内存的值。另外一种方法更简单,你在函数里创造一个指针然后 return他就可以了。

    正确写法:

    #include <stdio.h> 
    #include <stdlib.h> 
    void getmemory(char **p) 
    { 
      *p=(char *) malloc(100); 
      strcpy(*p,"hello world"); 
    } 
    int main() 
    { 
      char *str=NULL; 
      getmemory(&str); 
      printf("%s/n",str); 
      free(str); 
      return 0; 
    } 
    void getmemory(char &*p) 
    { 
        p=(char *) malloc(100); strcpy(p,"hello world"); 
    } 

    或者

    void getmemory(char **p) 
    
    { 
        *p=(char *)malloc(100); strcpy(*p,"hello world"); 
    }

    你那样做开始str和p指向的一样是NULL(即内容一样),但是p=(char *) malloc(100); 后str仍然是NULL,但str得到了新的内存~

  • 相关阅读:
    语言相关
    一道简单DP题
    一道概率题
    Android CrashHandler
    一道简单数学题
    面试中遇到的随机题目
    VMWare 无损扩展磁盘大小
    Android 源码编译记录
    Android handler 内存泄露分析及解决方法
    Android 反编译
  • 原文地址:https://www.cnblogs.com/zpehome/p/3046993.html
Copyright © 2020-2023  润新知