C语言中有4中存储类型:
Auto:内存在栈区和堆区(调用函数),可读,可写
Static:存放在数据段区,可读可写
Register:内存在寄存器区
全局变量:存放在数据段区,可读可写
Auto类型的存储类型变量,主要用在:
1、函数内部,普通变量
2、函数形参列表,变量普通
3、函数内部,块作用区
注意:auto变量时在程序执行的时候分配内存,但是对于数组:
Int a[10];其属于静态数组,即实在编译时就分配内存空间了。
-------------------auto开始未被赋初值,那么其中会是一个随机数---------------------------
Static类型存储类型变量,主要用在:
1、函数外部,静态全局变量
2、函数内部,静态局部变量
对于static的静态变量需要知道几点:
注意一:静态全局变量,如果不是定义在所有函数的顶部,若未被声明,其作用范围,为其定义位置开始的其下所有函数范围。
注意二:静态局部变量,其作用范围,仅仅是在其定义的函数内,而不能被其他函数使用。
注意三:静态变量的,生存周期都是从定义它开始到整个程序的结束
注意四:在编译时就分配内存空间
----------------------------static开始未被赋初值,那么系统会给其赋值为0-------------------
全局变量类型的存储类型变量,主要用在:
1、函数外,如未被声明在别的位置,其作用范围是,当前位置起及其下的所有范围
注意:该变量可以被其他文件用extern来声明在其他文件内使用
---------------------------------------------------全局变量------------------------------------------------
Register类型的存储类型变量:
1、其存储位置是寄存器
2、其与auto变量类似,具有自动存储时期,局部作用域。
3、无法获取地址。
4、没被初始化,其值未定。
5、Double类型变量不能用register存储类型
-------------------------------------------register变量------------------------------------------------
动态内存管理
需要动态存储的原因:有些操作只有在程序运行时才能确定,这样编译器在编译时就无法为他们先分配空间,只能在程序运行时分配。
动态分配内存都是在堆区分配内存的。
在c中:malloc,calloc,realloc,这些函数来动态分配内存,释放是通过free来释放
在c++中:new来动态分配内存,delete来释放内存。
--------对于上面这些存储分配函数,我下面会详细分析:
-------------------------------------malloc和free解读---------------------------------------------------------
函数原型解析:
void *malloc(size_t,size):其头文件是#include<stdlib.h>
解读一:首先该函数的返回值是个void*类型的指针,那么意味着,在给变量,或者是结构体动态分配内存时,需要强转类型
解读二:对于该函数,size_t表示整形,其功能是,分配size个字节大小的空间,如果分配成功,则返回该段内存的首地址,如果size为0,或者分配内存过大,系统不能给予,即不能分配成功,那么返回NULL
其应用有结构体等,因而通过方法函数可以使用该malloc函数创建一个空的链表,针对这个概念,可以看下我写的数据结构源码,里面大量运用了该函数,这里简单概述一下,如下:
Typedef Struct stu{
Char name[20];
Int age;
Long long num;
}student,*stu;
stu stu1=(stu)malloc(sizeof(student))
讲到malloc不得不说原型函数 :void free(void *ptr) 其头文件是#include<stdlib.h>
解析一:free(ptr),这个ptr必须是指向,通过malloc,或者calloc 或者realloc分配的到的内存空间的首地址的
解析二:如果free(ptr)之前已经释放了ptr,那么程序会呈现不可预知的错误。
解析三,该函数原型表明,这个函数是没有返回值得。
-------------------------------------malloc和free解读---------------------------------------------------------
-------------------------------------calloc的解读,其也和free连用-----------------------------------------
函数原型:void *calloc(size_t nmemb,size_t size)
解读一:该函数返回值是一个void *的指针,因而在给动态分配内存是需要强制类型转换。
解读二:这里有两个参数,nmemb和size,他们前者表示要分配变量类型的大小,后者表示要分配几个这个大小的空间,用法如下:
范例 | /* 动态配置10个struct test 空间*/ |
解读三:通过calloc得到的空间内存中全都被初始化为0.
一般我用的是malloc这个函数很少用到,注意,这个函数的也用free函数来释放内存空间(这里是内存空间而不是指针,也就是说free后,原来的指针还是指向原来的位置,只是此时他成为了野指针,如需要详细了解野指针等概念,可以查看我写的指针的文章,里面有详细描述)
-------------------------------------calloc的解读,其也和free连用-----------------------------------------
-------------------------------------realloc的解读,其也和free连用-----------------------------------------
该函数的函数原型:void *realloc(void *ptr,size_t size);,
解读一:该函数的返回值是void *类型,因而在动态分配内存是需要强转类型。
解读二:为指针ptr加长size个字节的内存空间。
实例如下:
#include<stdio.h>
2 #include<stdlib.h>
3 int main(){
4 int input,n;
5 int count=0;
6 int *numbers=NULL;
7 int *more_numbers=NULL;
8
9 do{
10 printf("input your value:");
11 scanf("%d",&input);
12 count++;
13
14 more_numbers = (int*)realloc(numbers,count * sizeof(int));
15
16 if(more_numbers != NULL){
17 numbers=more_numbers;
18 numbers[count-1] = input;
19 }else {
20 free(numbers);
21 puts("error reallocating memory");
22 exit(1);
23 }
24
25 }while(input != 0) ;
26 printf("numbers entered:");
27 for(n=0;n<count;n++)
28 printf("%d ",numbers[n]);
29 free(numbers);
30 return 0;
31 }
-------------------------------------realloc的解读,其也和free连用-----------------------------------------