Char *p = (char *)malloc(sizeof(char) * (len + 1))
If(NULL == p)
Return
-1
Strcpy(p,a)
//
If(strcmpy(p,a) == 0)
3.
指针参数如何传递内存。
Y
:
Void GetMemory1(char *p, int num)
{
P = (char *)malloc(sizeof(char) * num)
}
//
问题:
编译器总是要为函数的每个参数制作临时副本,
指针参数
p
的副本上
_p,
编译器使
_p = p .
如果函数体内的程序修改了
_p
的内容
,
就导致参数
P
的内容作
相应的修改
。这就是指针可以用作输出参数的原因。在本例中,
_p
申请了新的内
存,
只是把
_p
所指的内存地址改变了,但是
p
丝毫未变
。所以函数
GetMemory
并
不能输出任何东西,事实上,每执行一次
GetMemory
就会泄漏一块内存,因为没
有用
free
释放内存。
用指向指针的指针后解决这个问题:
Void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num)
}
用函数返回值了解决:
Char *GetMemory3(int num)
{
Char *p = (cahr * )malloc(sizeof(char) * num)
Return p
}
Void Test(void)
{
Char *str = NULL
GetMemory1(str, 100);//
申请内存错误
GetMemory2(&str, 100) //
注意参数是
&str
,而不是
str
。
Str = GetMemory3(100)
Strcpy(str,
“
hello
”
);
}
4.
Free/delete,
只是把指针所指的内存释放掉,并没有把指针本身干掉。
5.
函数体内局部变量在函数结束时自动消亡。
但是局部指针变量,
消亡的时候它所指
的动态内存不一定一起消亡
.(
比如别的模块调用怎么办
)
。
1
、指针消亡了,并不表
示它所指的内存会被自动释放。
2
、内存被释放了,并不表示指针会消亡或者成了
NULL
指针。