1. 幾種生成空指針的方法:
int *p1=nullptr;//等價于int *p1=0;C++11引入的砂碉,建議使用
int *p2=0;//直接將p2初始化為字面常量0
//需要首先#include cstdlib
int *p3=NULL;//等價于int *p3=0;
2. main函數(shù)執(zhí)行以前及以后,分別還會執(zhí)行什么代碼特碳?
(1). 一些全局變量诚亚、對象和靜態(tài)變量、對象的空間分配和賦初值在main之前午乓,main之后還要執(zhí)行一些諸如釋放空間站宗、釋放資源使用權等操作。
(2). 全局對象的構造函數(shù)在main之前執(zhí)行益愈,析構函數(shù)在main之后執(zhí)行梢灭。
(3). main函數(shù)之后會執(zhí)行atexit注冊的函數(shù)。
3. C\C++程序編譯的內(nèi)存分配情況
一個C/C++程序編譯時內(nèi)存分為5大存儲區(qū):堆區(qū)蒸其、棧區(qū)敏释、全局區(qū)、程序代碼區(qū)摸袁、文字常量區(qū)钥顽。
(1). 程序代碼區(qū)。代碼要執(zhí)行靠汁,肯定要將代碼的二進制文件加載進內(nèi)存蜂大。
(2). 字符串常量區(qū)。
char *s1="hello";
char *s2="hello";
這樣定義字符串時蝶怔,s1是等于s2的县爬,意思是兩者指向同一字符串,該字符串在字符串常量區(qū)添谊。
C/C++內(nèi)存分配方式有3種
(1). 從靜態(tài)存儲區(qū)分配:
內(nèi)存在程序編譯時就已經(jīng)分配好财喳,這塊內(nèi)存在程序的整個運行期間都存在。速度快斩狱、不容易出錯耳高,因為有系統(tǒng)會善后。例如全局變量所踊,static變量等泌枪。
(2). 在棧上分配:
在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都在棧上創(chuàng)建秕岛,函數(shù)執(zhí)行結束時這些存儲單元自動被釋放碌燕。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中误证,效率很高,但是分配的內(nèi)存容量有限修壕。
(3). 從堆上分配:
即動態(tài)內(nèi)存分配愈捅。程序在運行的時候用malloc或new申請任意大小的內(nèi)存,程序員自己負責在何時用free或delete釋放內(nèi)存慈鸠。動態(tài)內(nèi)存的生存期由程序員決定蓝谨,使用非常靈活。如果在堆上分配了空間青团,就有責任回收它譬巫,否則運行的程序會出現(xiàn)內(nèi)存泄漏,另外頻繁地分配和釋放不同大小的堆空間將會產(chǎn)生堆內(nèi)碎塊督笆。
4. #include<>與“ ”
在C程序中包含文件有以下兩種方法:
用符號“<”和“>”將要包含的文件的文件名括起來芦昔。這種方法指示預處理程序到預定義的缺省路徑下尋找文件。預定義的缺省路徑通常是在INCLUDE環(huán)境變量中指定的娃肿,請看下例:
INCLUDE=C:\COMPILER\INCLUDE烟零;S:\SOURCE\HEADERS;
對于上述INCLUDE環(huán)境變量咸作,如果用#include<file>語句包含文件锨阿,編譯程序?qū)⑹紫鹊紺:\COMPILER\INCLUDE目錄下尋找文件;如果未找到记罚,則到S:\SOURCE\HEADERS目錄下繼續(xù)尋找墅诡;如果還未找到,則到當前目錄下繼續(xù)尋找桐智。用雙引號將要包含的文件的文件名括起來末早。這種方法指示預處理程序先到當前目錄下尋找文件,再到預定義的缺省路徑下尋找文件说庭。
對于上例中的INCLUDE環(huán)境變量然磷,如果用#include“file”語句包含文件,編譯程序?qū)⑹紫鹊疆斍澳夸浵聦ふ椅募浚蝗绻凑业阶怂眩瑒t到C:\COMPILER\INCLUDE目錄下繼續(xù)尋找;如果還未找到捆憎,則到S:\SOURCE\HEADERS目錄下繼續(xù)尋找舅柜。
#include<file>
語句一般用來包含標準頭文件(例如stdio.h或stdlib.h),因為這些頭文件極少被修改躲惰,并且它們總是存放在編譯程序的標準包含文件目錄下致份。#include“file”語句一般用來包含非標準頭文件,因為這些頭文件一般存放在當前目錄下础拨,你可以經(jīng)常修改它們氮块,并且要求編譯程序總是使用這些頭文件的最新版本绍载。