C语言学习008-内存相关

119 阅读5分钟

1、不同作用域名变量和内存分类总结:

类型作用域生命周期存储位置补充说明
局部变量(auto自动变量)一对{}内当前函数栈区测试说明情况的地方有具体的情况怎么说呢
static(静态)局部变量一对{}内整个程序初始化在data段,未初始化在bss段
(当前文件可用)全局变量整个程序整个程序在函数外定义,只能在当前文件中使用,并且全局变量不同文件是不可同名的
(整个程序)extern全局变量整个程序整个程序初始化在data段,未初始化在bss段要想在文件1中使用文件2中的全局变量,需要在文件2中定义的变量加上extern,同时要在文件1中声明extern变量
(当前文件)static(静态)全局变量当前文件整个程序初始化在data段,未初始化在bss段函数外定义,不同文件中的可以重名,值只初始化一次
extern函数整个程序整个程序代码区
static函数当前文件整个程序代码区
register变量一对{}内当前函数运行时存储在CPU寄存器
字符串常量当前文件整个程序data段

补充说明:全局变量种类的影响力大小: static全局变量 < 默认全局变量 < extern全局变量

补充总结:
1、同一个程序中,只有一个main函数,无论全局的还是static静态的,只能有一个main函数,是程序入口,main入口函数也可以是static的
2、同一个程序中,所有文件中不能有同名的非静态函数,也就是不能有同名的默认函数,也就是只能有一个名称的全局函数,其他文件中可以定义静态的同名函数。
3、同一个程序中,全局函数可以随意相互调用,当然默认先调用当前文件中的同名函数,无论是否static的
4、与函数一样的是,全局变量在所有文件中不能有同名的(定义,可以有同名的声明==>用于访问其他地方同名变量),一个文件的static变量名定义和其他文件全局变量名定义可以同存。

5、在c文件函数外部访问其他文件的变量,可以直接声明同名变量,extern可省略,但是要是在函数内部临时引用其他文件的全局变量,就必须要加上extern进行声明,否则报错不能使用未定义的变量。

6、根据第五点,在函数外声明的变量,如果没有引用到其他文件的变量,默认都会初始化一个值,int 是0,所以函数外的变量的extern可以省略,但是在函数内部声明的变量必须要赋值,除非是extern的。这一点和java类似。

7、extern:外部变量,static:静态变量

8、对于函数来说,有没有extern一样,因为声明没有函数体,定义有函数体,所以很容易区分。

9、多文件编程中头文件就是利用上面的特性,头文件中包含源文件中变量的声明和函数的声明,别的文件包含之后就能访问对应源文件的函数和变量了。在调用端也可以直接修改外部的变量的值的。 尽量不要在头文件中定义变量和声明

10、外部变量extern关键字省略和不省略的区别:省略的话,如果程序中没有该全局变量的定义,使用的时候不会报错,但是一旦加上了extern关键字,就必须要别的地方已经定义了,然后才能使用,否则使用会报错。因为没有找到定义,全局的int声明默认会赋值0,其他的也有默认值

11、只有多个同名声明,没有找到定义的变量,默认会把其中一个变成定义,其他的是外部引用,至于把哪个变成定义,这个无所谓,反正只有一个定义,其他的是外部引用了。

二、内存操作函数
1、memset(*s,int c,int size n):将s首地址的内存区域的前n个字节按照字符c填充, 因为n是字节,所以n最好不要手写,用sizeof来获取
c必须是字符:0-255
int a[10]; memset(a,'A',sizeof(a));

2、memcpy(*des,*src,int n);拷贝src内存中前n个字节到des内存上
int a[2] = {1,2};int b[2];memcpy(b,a,sizeof(a));

3、memmov:和memcpy类似,区别:des和src内存重叠时,mov仍然能处理,效率低一些
4、memcmp(*s1,*s2,int n) 比较s1地址和s2地址前n个字节
相等结果是0,大于结果是1,小于结果是-1

三、堆内存的释放和分配
1、malloc(int n) 在动态存储区(堆)上分配n个字节大小的连续空间,用来存储指定的类型。

int *array = (int *)malloc(2 * sizeof(int)):分配一个长度2的int数组的空间。并返回指针类型。

2、free(*p) 是否p指向的内存空间 。p指向的空间需要时由malloc函数分配的空间区域