段错误:就是地址非法使用了
栈
1.存放局部变量或者函数的参数(static为什么会延长,因为存储位置发生改变)
2. 特点:由系统开辟和释放。
代码演示
#include
Char *fun()
Int main(void)
{
Printf(“%s\n”,fun());
Return 0;
//正常结束 return-1异常结束。
}
Char *fun()
{
Char st[] = “hello”;//存放在栈区,栈区由系统开辟和释放
Static char st[] = “hello”//延长生命周期 把st放到了.data区 。程序结束内存才释放
Return st;
Return :表示结束子函数的所有操作,返回到调用函数。
}
不加static修饰时先看主函数,主函数进行了函数调用,到子函数里面hello存放在栈区作用区域只是在这个子函数中。当数组的首地址返回被调用函数接受时。数组st里面的东西就已经被释放了里面没有任何东西,这个区域已经不属于st了,但是这个区域还是存在的。然后你再在这个地址上用%s打印的话是打印不出来任何东西的。
加了static 先看主函数,里面进行了函数的调用,然后进去子函数里面,由于数组被static修饰了 数组的存储位置由栈区改变到了全局区或者静态区,生命周期是整个函数,直到函数结束才被销毁。然后函数st的首地址被函数接受,然后函数再用%s打印 就可以打印出内容。
堆区:
Malloc申请的生命周期从malloc申请到free
特点:从malloc申请到free的空间否可以使用
第三个没有被释放。
常量区:
Char*st=”hello“;
St在栈区。
Hello在常量区 生命周期是程序结束。
.bss .data静态区或者全局区
.bss
1.段存放的是未初始化的全局变量和静态变量以及已初始化为零的全局变量和静态变量
2.生命周期 程序结束
.data
1. 已经初始化的全局变量和静态变量 但初始化不能为零。如果初始化为零不在.data区在.bss段
为什么没有初始化的全局变量值为零
因为存放在.bss段