C语言精讲之程序中内存从哪里来(2)栈

C语言精讲之程序中内存从哪里来(1)内存
C语言精讲之程序中内存从哪里来(2)栈
C语言精讲之程序中内存从哪里来(3)堆
C语言精讲之程序中内存从哪里来(4)数据段

2、栈

栈具有运行时自动分配&自动回收、反复使用、脏内存、临时性(函数不能返回栈变量的指针)。

(1)、栈内存是先进后出,是每进程自带的小块内存。

(2)、运行时自动分配&自动回收
栈是自动管理的,程序员不需要手工干预,方便快捷。

(3)、反复使用
栈内存在程序中其实就是那一块空间,程序反复使用这一块空间。

(4)、脏内存
栈内存由于是反复使用的,每次使用后程序不会去清理,因此分配到时保存的是上一个函数的变量赋值。
(要养成好的习惯,定义局部变量的时候要先初始化变量)好比:你要住一个酒店,房间是上一个人住的,你进去要先打扫房间,然后在住,走以后你不会再去清理房间,当下一个人住进来的时候又是保存着你住过的样子。

(5)、临时性
一、函数不能返回栈变量的指针(实际中不能返回局部变量的地址,有可能会被改变,临时性的),因为这个空间是临时的。当返回指针时就会警告

二、这个局部变量是分配在栈上的,虽然不在了但是栈内存还在还可以访问,但是访问时实际上这个内存地址已经和当时的那个变量无关了。

(6)、栈会溢出
因为操作系统事先给定了栈的大小,如果在函数中无穷尽的分配内存总能用完,就会产生段错误。
但是想定义大量的数据元素怎么办呢?就用到内存的其它方式堆或者数据区了。

测试代码:

#include

int func(void)
{
	int a=3;
	printf("&a= %p\n",&a);
	return &a;      //不能返回指针,编译器会警告

}

int main()
{
	int *p=NULL;
	p = func();
	printf("p = %p\n",p);   //不能正确的得到a的地址

	printf("*p = %d\n",p);  //得不到正确的值
	return 0;
}

你可能感兴趣的:(C语言精讲之程序中内存从哪里来(2)栈)