赞
踩
例一:无法获得开辟好的内存
- void GetMemory(char *p)
- {
- p = (char *)malloc(100);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(str);
- strcpy(str, "hello world");
- printf(str);
- }
这是一个常见的错误:调用了GetMemoy把str所指向那个null当作形参给这个函数,函数开辟了100字节空间给p,但是这里的p是形参(形参是实参的临时拷贝,str和p指向的是完全不同的空间,出了GetMemoy这个函数,p就会被销毁)没有办法拿到动态开辟的内存的地址,所以出了这个函数p就不存在,但是开辟的内存依然存在,这会导致开辟的内存无法释放,导致内存泄漏。再调用strcpy,把hello word拷贝到str所指向的空字符串中必然会出错!!!
改造一下就ok了
方法一:
- void GetMemory(char** p)
- {
- *p = (char*)malloc(100);
- }
- void Test(void)
- {
- char* str = NULL;
- GetMemory(&str);//把str的地址传过去,使其改变地址指向的内容
- strcpy(str, "hello world");
- printf(str);
- }
把str的地址取出来给GetMemoy函数,使得改变str的指向,这样出了Getmemoy这个函数,str也能指向动态开辟的内存,这样一来就可把字符串拷贝到str了
方法二:
- char* GetMemory()
- {
- char *p=(char*)malloc(100);
- if (p==NULL) {
- perror("");
- }
- else
- {
- return p;
- }
-
- }
- void Test(void)
- {
- char* str = NULL;
- str=GetMemory();
- strcpy(str, "hello world");
- printf(str);
- }
把开辟好的空间返回来赋给str也是可以的!!
例二:对动态内存的越界访问
这里开辟了16字节内存,每一个int*的访问的地址是4个字节,而i等于5时就已经访问了20个字节了,超出了开辟的16字节,所以报错!!!
例三:对非动态内存的free释放
这里的p不是动态开辟的内存,不可以free释放!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。