1 什么是野指针
前面我们把内存比作尺子,很轻松的理解了内存。尺子上的 0 毫米处就是内存的0 地址处,也就是 NULL 地址处。这条栓“野指针”的链子就是这个“NULL”。定义指针变量的同时最好初始化为 NULL,用完指针之后也将指针变量的值设置为 NULL。也就是说除了在使用时,别的时间都把指针“栓”到 0 地址处。这样它就老实了。
2 栈、堆和静态区
静态区:保存自动全局变量和 static变量(包括 static全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
堆:由 malloc系列函数或 new操作符分配的内存。其生命周期由 free或 delete决定。在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。
3常见的内存错误及对策
1)指针没有指向一块合法的内存
1.1 结构体成员指针未初始化
struct student
{
char *name;
int score;
}stu,*pstu;
int main()
{
strcpy(stu.name,"Jimy");
stu.score = 99;
return 0;
}
注意:strcpy原型
char *strcpy(char *strDest,constchar *strSrc);//第二个参数设置为常量 是不想在函数中间 让其发生改变
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 这句是断言 判断不该出现的错误
//如果出现作物 立即在这里停止
char *address = strDest;//创建一个地址指针用于返回
while( (*strDest++ = * strSrc++) != ‘