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得到了新的内存~

原文地址:https://www.cnblogs.com/zpehome/p/3046993.html