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