1.野指针
定义之后没有被初始化和使用,用完之后没有释放。所以定义完指针变量之后一定要将其初始化为NULL。
2.堆栈和静态区
静态区:自动全局变量、static的全局、局部变量,静态区的生命周期是整个程序,是由编译器进行分配的。
栈区:保存局部变量、形参,在函数范围内存在。
堆区:由程序员用malloc和new等操作符进行内存的分配。其生命周期是由free和delete决定的。
常见的内存错误问题
1.结构体成员的指针没有初始化
如图定义了一个结构体,结构体里面定义了一个指针变量。当使用strcpy时,因为name指针并没有指向实际的内存地址,所以会发生错误。
但是有时在使用结构体指针分配内存的时候要注意,其分配还是四个字节的指针内存。
要想解决上面的问题,解决的方法就是直接给name指针分配需要的内存大小。
注意事项:
1.不管什么时候在使用指针搞的时候都要确保指针的有效性。
一般在函数入口处使用 assert(NULL != p)对参数进行校验。在非参数的地方使用
if(NULL != p)来校验。但这都有一个要求,即 p 在定义的同时被初始化为 NULL 了。
2.在为字符串常量分配内存时要注意“\0”
char *p2 = (char *)malloc(sizeof(char)*strlen(p1)+1*sizeof(char));
3.内存分配成功后,一定要初始化。
int i = 0; char *p = NULL;
如果定义的是数组的话,可以这样初始化: int a[10] = {0};
或者用 memset 函数来初始化为 0: memset(a,0,sizeof(a));