一个C语言典型的内存泄露问题
具体的问题见下面的demo:
#include <stdio.h> void getheap(int *p)//p是NULL的地址 { p = malloc(sizeof(int) * 10); //p重新指向了分配在堆中的空间 }//形式参数int *p在栈空间内,函数结束后就释放了,malloc分配的空间也丢失了,同样也没有带回实参 int main() { int *p = NULL; //NULL就是(void *)0 printf("p=%p ", p);//p是null的地址 printf("p=%p ", &p);//&p是p本身的地址 getheap(p);//值传递,将NULL的地址传递给形参 p[0] = 10; p[1] = 20; printf("p[0]=%d,p[1]=%d ",p[0],p[1]); free(p);//p中不是堆中分配的空间的首地址,故free(p)也有问题 return 0; }运行:
原因:
改正如下:
#include <stdio.h> void getheap(int **p)// p就是s实参p的地址 { *p = malloc(sizeof(int) * 10);//将在堆中分配的空间的地址赋值给实参p,即实参p就是在堆中分配空间的地址 }//函数调用结束后,实参p的值就是在堆中分配空间的首地址 int main() { int *p = NULL; getheap(&p);//将指针p本身的地址传递给形参 p[0] = 10; p[1] = 20; printf("p[0]=%d,p[1]=%d ", p[0], p[1]); free(p);//p的值就是在堆中分配空间的首地址 return 0; }运行正常:
因为:
其中0x100是p本身的地址,形参里**p的p就是0x100,
*p=malloc(sizeof(int) *10);假设分配的空间地址是0x123, 相当于将main函数里面的p=0x123,即p指向了分配的空间的首地址;
int *getheap2()//正确:把申请的堆的地址返回 { return malloc(100); } char *getstring()//错误:array是在栈中的,函数结束后,地址消失 { char array[10]="hello"; return array; } char getstring1()//正确:返回的是值,不是地址,即便c是栈中的变量,即便地址消失了 { char c="a"; return c; } const char *getstring2()//正确:常量在静态区,地址在程序运行的时候一直存在 { return "hello";//可以将一个常量的地址作为一个函数的返回值返回 } char *getstring3()//正确: { static char array[10]="hello";//在静态区 return array; } int main() { int *p=NULL; p=getheap2();//正确 char *s=getstring();//错误 char c=getstring1();//正确 const char *s1=getstring2();//正确 const char *s2=getstring3(); return 0; }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: C#中的decimal类型
- 下一篇:没有了