C++学习笔记04
1:C++ SegmentFalut 错误 计算机是段页式存储管理方式管理,首先是段地址,然后是页地址,最后是偏移量,然后把虚拟地址转换为物理地址。SegmentFalut就是使用虚拟地址找不到合法的物理地址,通常都是因为指针使用使用错乱导致的。指针使用错乱导致虚拟地址找不到合法的物理地址(找不到或者找到了其他进程的地址),Linux会保护进程,所以操作系统的做法就是直接返回,报Segment Falut的错误。
KleeFp的中Gcc不同的版本的String的编码不同,所以导致出现问题,使用C风格的char*字符串它会使用C风格来解析,这样就应该没问题了。
在注意下,首先C和C++的编码标准都不一样,比如C++对函数的编码和C对函数的编码; 同时针对不同版本的C++的编码也不一样,可能出现不兼容的情况,比如C++98的string和C++11的string。
2,变量类型:
自动类型:比如局部类型变量
静态类型: static变量。前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的; 如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。
寄存器类型:使用寄存器存储,而不是内存,比如循环变量
外部类型extern:外部类型变量必须是全局变量,在C++中有两种情况要使用外部类型变量:一:在一个源程序文件中,在全局定义之前使用,必须要做外部类型声明;二:一个文件要引用另一个文件的全局变量,引用之前必须要做外部声明。如果某文件中定义的全局变量不想被其他文件调用所在文件,直接申请为静态变量,也就是静态全局变量只能供所在文件使用。
3,全局变量与全局静态变量的区别:
(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
(c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用;
静态全局变量的作用:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。
(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
(c) 只能在本文件中使用!具有内部链接的静态;不允许在其他文件里调用;
静态局部变量和作用域和局部变量一样,不过生存周期不一样,局部变量在定义局部变量的函数调用完之后就从内存中释放其值,而静态局部变量不释放,等整个程序全部执行结束后才会从内存中释放。
关于外部链接的含义
首先从静态变量说起. C语言里面静态变量有三种: 分别是外部链接性,内部链接性和无链接性.
声明外部链接的变量的方法是在代码块外面声明它. 此变量是全局变量,多文件中亦可用.
声明内部链接的变量的方法是在代码块外面声明它并加上static限定符. 此变量是全局变量,但仅在本文件中可用.
声明无链接的变量的方法是在代码块里面声明它并加上static限定符. 此变量是局部变量,但仅在本代码块中可用.
例如
#include<...........>
int global=1; //声明外部链接的变量
static int global2 //声明内部链接的变量
int func()
{
int global=5; //声明的内部变量和全局变量重名,调用时将会隐藏全局的global;
cout<<global; //是内部定义的global的值而不是外面的值.
//如何引用外面的变量呢???
cout<<::global; //可用作用域解析符(::)来说明你要输出的外面的全局变量.
static int global3; //声明无链接的变量
}
int main()
{
extern int alobal; //在本文件中此句可选.此句的意思为你需要引用外部的变量global;
global=8; //直接引用全局变量.
}
所以,全局变量和静态变量和全局静态变量是不一样的!!!!!