一些碎知识点

1. 几种生成空指针的方法:

int *p1=nullptr;//等价于int *p1=0;C++11引入的,建议使用
int *p2=0;//直接将p2初始化为字面常量0
//需要首先#include cstdlib
int *p3=NULL;//等价于int *p3=0;

2. main函数执行以前及以后,分别还会执行什么代码?

(1). 一些全局变量、对象和静态变量、对象的空间分配和赋初值在main之前,main之后还要执行一些诸如释放空间、释放资源使用权等操作。
(2). 全局对象的构造函数在main之前执行,析构函数在main之后执行。
(3). main函数之后会执行atexit注册的函数。

3. C\C++程序编译的内存分配情况

一个C/C++程序编译时内存分为5大存储区:堆区、栈区、全局区、程序代码区、文字常量区。
(1). 程序代码区。代码要执行,肯定要将代码的二进制文件加载进内存。
(2). 字符串常量区。

char *s1="hello";
char *s2="hello";

这样定义字符串时,s1是等于s2的,意思是两者指向同一字符串,该字符串在字符串常量区。
C/C++内存分配方式有3种
(1). 从静态存储区分配:
内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。
(2). 在栈上分配:
在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3). 从堆上分配:
即动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

4. #include<>与“ ”

在C程序中包含文件有以下两种方法:

  • 用符号“<”和“>”将要包含的文件的文件名括起来。这种方法指示预处理程序到预定义的缺省路径下寻找文件。预定义的缺省路径通常是在INCLUDE环境变量中指定的,请看下例:
    INCLUDE=C:\COMPILER\INCLUDE;S:\SOURCE\HEADERS;
    对于上述INCLUDE环境变量,如果用#include<file>语句包含文件,编译程序将首先到C:\COMPILER\INCLUDE目录下寻找文件;如果未找到,则到S:\SOURCE\HEADERS目录下继续寻找;如果还未找到,则到当前目录下继续寻找。

  • 用双引号将要包含的文件的文件名括起来。这种方法指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。
    对于上例中的INCLUDE环境变量,如果用#include“file”语句包含文件,编译程序将首先到当前目录下寻找文件;如果未找到,则到C:\COMPILER\INCLUDE目录下继续寻找;如果还未找到,则到S:\SOURCE\HEADERS目录下继续寻找。
    #include<file>语句一般用来包含标准头文件(例如stdio.h或stdlib.h),因为这些头文件极少被修改,并且它们总是存放在编译程序的标准包含文件目录下。#include“file”语句一般用来包含非标准头文件,因为这些头文件一般存放在当前目录下,你可以经常修改它们,并且要求编译程序总是使用这些头文件的最新版本。

推荐阅读更多精彩内容