1. c語言的變數根據分配的存儲空間的不同 可以分為哪三種變數
C語言變數存儲類型
auto
static
extern
static extern
register
auto 局部變數
auto 變數是用堆棧(stack)方式佔用儲存器空間,因此,當執行此區段是,系統會立即為這個變數分配存儲器空間,而程序執行完後,這個堆棧立即被系統收回.在大括弧{}內聲明.
自動變數就是指在函數內部定義使用的變數。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變數。自動變數是局部變數,即它的區域性是在定義他的函數內部有效。當然這說明自動變數也沒有鏈接性,因為它也不允許其他的文件訪問他。由於自動變數在定義他的函數的外面的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變數,他們之間不會發生沖突的。因為他們都有自己的區域性,而且它沒有鏈接性(即:不允許其他的文件訪問他的)。來看看自動量的持續性。計算機在執行這個函數的時候,創建並為它分配內存,當函數執行完畢返回後,自動變數就會被銷毀。這個過程是通過一個堆棧的機制來實現的。為自動變數分配內存就壓棧,而函數返回時就退棧。
static 靜態變數
一、局部靜態變數
局部變數按照存儲形式可分為三種auto, static, register。
與auto類型(普通)局部變數相比, static局部變數有三點不同:
1. 存儲空間分配不同
auto類型分配在棧上, 屬於動態存儲類別, 占動態存儲區空間, 函數調用結束後自動釋放, 而static分配在靜態存儲區, 在程序整個運行期間都不釋放. 兩者之間的作用域相同, 但生存期不同.
2. static局部變數在所處模塊在初次運行時進行初始化工作, 且只操作一次。
3. 對於局部靜態變數, 如果不賦初值, 編譯期會自動賦初值0或空字元, 而auto類型的初值是不確定的.
特點: static局部變數的」記憶性」與生存期的」全局性」
所謂」記憶性」是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.
注意事項:
1. 「記憶性」, 程序運行很重要的一點就是可重復性, 而static變數的」記憶性」破壞了這種可重復性, 造成不同時刻至運行的結果可能不同.
2. 「生存期」全局性和唯一性. 普通的local變數的存儲空間分配在stack上, 因此每次調用函數時, 分配的空間都可能不一樣, 而static具有全局唯一性的特點, 每次調用時, 都指向同一塊內存, 這就造成一個很重要的問題 ---- 不可重入性!!!
二、外部靜態變數/函數
在C中static有了第二種含義:用來表示不能被其它文件訪問的全局變數和函數。, 但為了限制全局變數/函數的作用域, 函數或變數前加static使得函數成為靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件(所以又稱內部函數)。注意此時, 對於外部(全局)變數, 不論是否有static限制, 它的存儲區域都是在靜態存儲區, 生存期都是全局的. 此時的static只是起作用域限製作用, 限定作用域在本模塊(文件)內部.
使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
extern 變數
外部變數 定義在程序外部,所有的函數很程序段都可以使用.
外部變數可能會在某一程序段被重新定義,以段內變數為參考值.
static extern 變數
靜態外部變數和外部變數差別在於,外部變數生命可以同時給多個文件使用,而靜態外部變數則只能給聲明此變數的文件使用.
register 變數
寄存器變數,是由寄存器分配空間,訪問速度比訪問內存快,加快執行速度.寄存器大小有限.
在c語言當中可以使用寄存器變數來優化程序的性能,最常見的是在一個函數體當中,將一個常用的變數聲明為寄存器變數: register int ra; 如果可能的話,編譯器就會為它分配一個單獨的寄存器,在整個函數執行期間對這個變數的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了性能。
不能用於全局變數。現在的情況是VC忽略用戶定義的REGISTER,因此定義一個REGISTER變數與不定義一個REGISTER是一樣的,編譯器進行相同的優化,因為MS認為,REGISTER是系統中寶貴的資源,應該由系統統一調配,而且認為VC編譯器的優化能力要大於一般的程序員。因此也有人說register關鍵字在PC機(x86CPU)無用,編譯器按自動變數處理。
注意: register是不能取址的。
register int j; int *p = &j;是錯的,因為無法對寄存器的定址。
【摘自http://..com/link?url=-j__t2Ou7LNCgyoA8N06a】
2. 內存條的存儲類型是什麼
RAM。
如果記不住CD-ROM總知道吧,記得內存跟它相反。
3. 內存的分配方式有哪幾種
內存的三種分配方式:
1. 從靜態存儲區分配:此時的內存在程序編譯的時候已經分配好,並且在程序的整個運行期間都存在。全局變數,static變數等在此存儲。
2. 在棧區分配:相關代碼執行時創建,執行結束時被自動釋放。局部變數在此存儲。棧內存分配運算內置於處理器的指令集中,效率高,但容量有限。
3. 在堆區分配:動態分配內存。用new/malloc時開辟,delete/free時釋放。生存期由用戶指定,靈活。但有內存泄露等問題。
常見內存錯誤及對策
1. 內存分配未成功,卻被使用。
對策:使用內存之前檢查是否分配成功。用p!=NULL判斷。
2. 內存分配成功,未初始化就被使用。
內存的預設值沒有統一的標准。大部分編譯器以0作為初始值,但不完全是。
對策:內存初始化時賦初值。
3. 內存操作越界。
對策:只能是小心了。
4. 釋放了內存,仍然使用。
(1) 使用顯示delete和free的野指針。
對策:釋放完內存,將指針置為NULL。
(2) 使用隱式delete和free的野指針。主要是指函數返回指向棧內存的指針或引用。
對策:當然是不要返回就可以了。
5. 未釋放內存,導致內存泄露。
用new/malloc開辟了內存,沒用delete/free釋放.
對策:new和delete的個數一定相同;malloc和free的個數一定相同;new[]和[]delete一定對應。
4. 什麼是變數的存儲類型
量有4種存儲類型,分別是auto(自動型)、static(靜態型)、register(寄存器型)和extern(外部型)。在定義或說明一個變數時可以加上存儲類型關鍵字,以限定其存儲類別。
存儲類型決定了系統將在哪一個數據存儲區為變數分配存儲空間。
5. 簡述計算機內存的分類及各自特點
內存就是暫時存儲程序以及數據的地方,比如當我們在使用WPS處理文稿時,當你在鍵盤上敲入字元時, DDR 和 DDR2 技術對比的數據
它就被存入內存中,當你選擇存檔時,內存中的數據才會被存入硬(磁)盤。在進一步理解它之前,還應認識一下它的物理概念。 內存一般採用半導體存儲單元,包括隨機存儲器(RAM),只讀存儲器(ROM),以及高速緩存(CACHE)。只不過因為RAM是其中最重要的存儲器。(synchronous)SDRAM 同步動態隨機存取存儲器:SDRAM為168腳,這是目前PENTIUM及以上機型使用的內存。SDRAM將CPU與RAM通過一個相同的時鍾鎖在一起,使CPU和RAM能夠共享一個時鍾周期,以相同的速度同步工作,每一個時鍾脈沖的上升沿便開始傳遞數據,速度比EDO內存提高50%。DDR(DOUBLE DATA RATE)RAM :SDRAM的更新換代產品,他允許在時鍾脈沖的上升沿和下降沿傳輸數據,這樣不需要提高時鍾的頻率就能加倍提高SDRAM的速度。
●只讀存儲器(ROM) ROM表示只讀存儲器(Read Only Memory),在製造ROM的時候,信息(數據或程序)就被存入並永久保存。這些信息只能讀出,一般不能寫入,即使機器停電,這些數據也不會丟失。ROM一般用於存放計算機的基本程序和數據,如BIOS ROM。其物理外形一般是雙列直插式(DIP)的集成塊。
6. 內存類型有哪幾種
經常見到的內存按出現的先後為:EDO,SD,DDR,DDR2,DDR3。
而實際上內存種類很多。
根據組成元件的不同,RAM內存又分為以下十八種:
01.DRAM(Dynamic RAM,動態隨機存取存儲器):
這是最普通的RAM,一個電子管與一個電容器組成一個位存儲單元,DRAM將每個內存位作為一個電荷保存在位存儲單元中,用電容的充放電來做儲存動作,但因電容本身有漏電問題,因此必須每幾微秒就要刷新一次,否則數據會丟失。存取時間和放電時間一致,約為2~4ms。因為成本比較便宜,通常都用作計算機內的主存儲器。
02.SRAM(Static RAM,靜態隨機存取存儲器)
靜態,指的是內存裡面的數據可以長駐其中而不需要隨時進行存取。每6顆電子管組成一個位存儲單元,因為沒有電容器,因此無須不斷充電即可正常運作,因此它可以比一般的動態隨機處理內存處理速度更快更穩定,往往用來做高速緩存。
03.VRAM(Video RAM,視頻內存)
它的主要功能是將顯卡的視頻數據輸出到數模轉換器中,有效降低繪圖顯示晶元的工作負擔。它採用雙數據口設計,其中一個數據口是並行式的數據輸出入口,另一個是串列式的數據輸出口。多用於高級顯卡中的高檔內存。
04.FPM DRAM(Fast Page Mode DRAM,快速頁切換模式動態隨機存取存儲器)
改良版的DRAM,大多數為72Pin或30Pin的模塊。傳統的DRAM在存取一個BIT的數據時,必須送出行地址和列地址各一次才能讀寫數據。而FRM DRAM在觸發了行地址後,如果CPU需要的地址在同一行內,則可以連續輸出列地址而不必再輸出行地址了。由於一般的程序和數據在內存中排列的地址是連續的,這種情況下輸出行地址後連續輸出列地址就可以得到所需要的數據。FPM將記憶體內部隔成許多頁數Pages,從512B到數KB不等,在讀取一連續區域內的數據時,就可以通過快速頁切換模式來直接讀取各page內的資料,從而大大提高讀取速度。在96年以前,在486時代和PENTIUM時代的初期,FPM DRAM被大量使用。
05.EDO DRAM(Extended Data Out DRAM,延伸數據輸出動態隨機存取存儲器)
這是繼FPM之後出現的一種存儲器,一般為72Pin、168Pin的模塊。它不需要像FPM DRAM那樣在存取每一BIT 數據時必須輸出行地址和列地址並使其穩定一段時間,然後才能讀寫有效的數據,而下一個BIT的地址必須等待這次讀寫操作完成才能輸出。因此它可以大大縮短等待輸出地址的時間,其存取速度一般比FPM模式快15%左右。它一般應用於中檔以下的Pentium主板標准內存,後期的486系統開始支持EDO DRAM,到96年後期,EDO DRAM開始執行。。
06.BEDO DRAM(Burst Extended Data Out DRAM,爆發式延伸數據輸出動態隨機存取存儲器)
這是改良型的EDO DRAM,是由美光公司提出的,它在晶元上增加了一個地址計數器來追蹤下一個地址。它是突發式的讀取方式,也就是當一個數據地址被送出後,剩下的三個數據每一個都只需要一個周期就能讀取,因此一次可以存取多組數據,速度比EDO DRAM快。但支持BEDO DRAM內存的主板可謂少之又少,只有極少幾款提供支持(如VIA APOLLO VP2),因此很快就被DRAM取代了。
07.MDRAM(Multi-Bank DRAM,多插槽動態隨機存取存儲器)
MoSys公司提出的一種內存規格,其內部分成數個類別不同的小儲存庫 (BANK),也即由數個屬立的小單位矩陣所構成,每個儲存庫之間以高於外部的資料速度相互連接,一般應用於高速顯示卡或加速卡中,也有少數主機板用於L2高速緩存中。
08.WRAM(Window RAM,窗口隨機存取存儲器)
韓國Samsung公司開發的內存模式,是VRAM內存的改良版,不同之處是它的控制線路有一、二十組的輸入/輸出控制器,並採用EDO的資料存取模式,因此速度相對較快,另外還提供了區塊搬移功能(BitBlt),可應用於專業繪圖工作上。
09.RDRAM(Rambus DRAM,高頻動態隨機存取存儲器)
Rambus公司獨立設計完成的一種內存模式,速度一般可以達到500~530MB/s,是DRAM的10倍以上。但使用該內存後內存控制器需要作相當大的改變,因此它們一般應用於專業的圖形加速適配卡或者電視游戲機的視頻內存中。
10.SDRAM(Synchronous DRAM,同步動態隨機存取存儲器)
這是一種與CPU實現外頻Clock同步的內存模式,一般都採用168Pin的內存模組,工作電壓為3.3V。 所謂clock同步是指內存能夠與CPU同步存取資料,這樣可以取消等待周期,減少數據傳輸的延遲,因此可提升計算機的性能和效率。
11.SGRAM(Synchronous Graphics RAM,同步繪圖隨機存取存儲器)
SDRAM的改良版,它以區塊Block,即每32bit為基本存取單位,個別地取回或修改存取的資料,減少內存整體讀寫的次數,另外還針對繪圖需要而增加了繪圖控制器,並提供區塊搬移功能(BitBlt),效率明顯高於SDRAM。
12.SB SRAM(Synchronous Burst SRAM,同步爆發式靜態隨機存取存儲器)
一般的SRAM是非同步的,為了適應CPU越來越快的速度,需要使它的工作時脈變得與系統同步,這就是SB SRAM產生的原因。
13.PB SRAM(Pipeline Burst SRAM,管線爆發式靜態隨機存取存儲器)
CPU外頻速度的迅猛提升對與其相搭配的內存提出了更高的要求,管線爆發式SRAM取代同步爆發式SRAM成為必然的選擇,因為它可以有效地延長存取時脈,從而有效提高訪問速度。
14.DDR SDRAM(Double Data Rate二倍速率同步動態隨機存取存儲器)
作為SDRAM的換代產品,它具有兩大特點:其一,速度比SDRAM有一倍的提高;其二,採用了DLL(Delay Locked Loop:延時鎖定迴路)提供一個數據濾波信號。這是目前內存市場上的主流模式。
15.SLDRAM (Synchronize Link,同步鏈環動態隨機存取存儲器)
這是一種擴展型SDRAM結構內存,在增加了更先進同步電路的同時,還改進了邏輯控制電路,不過由於技術顯示,投入實用的難度不小。
16.CDRAM(CACHED DRAM,同步緩存動態隨機存取存儲器)
這是三菱電氣公司首先研製的專利技術,它是在DRAM晶元的外部插針和內部DRAM之間插入一個SRAM作為二級CACHE使用。當前,幾乎所有的CPU都裝有一級CACHE來提高效率,隨著CPU時鍾頻率的成倍提高,CACHE不被選中對系統性能產生的影響將會越來越大,而CACHE DRAM所提供的二級CACHE正好用以補充CPU一級CACHE之不足,因此能極大地提高CPU效率。
17.DDRII (Double Data Rate Synchronous DRAM,第二代同步雙倍速率動態隨機存取存儲器)
DDRII 是DDR原有的SLDRAM聯盟於1999年解散後將既有的研發成果與DDR整合之後的未來新標准。DDRII的詳細規格目前尚未確定。
18.DRDRAM (Direct Rambus DRAM)
是下一代的主流內存標准之一,由Rambus 公司所設計發展出來,是將所有的接腳都連結到一個共同的Bus,這樣不但可以減少控制器的體積,已可以增加資料傳送的效率。
7. 內存分為幾類
內存分為基本內存、保留內存、上位內存、高端內存、擴充內存和擴展內存六大類。
1、基本內存
指手機自身所帶的內存,區別於外插的各種內存卡。如一台手機它的手機內存有60M,但它插有一個1G的存儲卡,那麼它的基本內存為60M。也用於指一些品牌電腦所帶有的內存容量。
2、保留內存
一般占據640KB~1024KB地址空間。分配給顯示緩沖存儲器、各適配卡上的ROM和系統ROM BIOS,剩餘空間可作上位內存UMB。UMB的物理存儲器取自物理擴展存儲器。此范圍的物理RAM可作為Shadow RAM使用。
3、上位內存
是常規內存上面一層的內存,又稱之為DOS高端內存(地址為0A0000H~0FFFFFH)。利用保留內存中未分配使用的地址空間建立,其物理存儲器由物理擴展存儲器取得。
4、高端內存
擴展內存中的第一個64KB區域(1024KB~1088KB)。由HIMEM.SYS建立和管理。
5、擴充內存
是一種早期的增加內存的標准,最多可擴充到32M。使用擴充內存必須在計算機中安裝專門的擴充內存板,而且還要安裝管理擴充內存板的管理程序。
6、擴展內存
在386以上檔次的微機中,有兩種存儲器工作方式,一種稱為實地址方式或實方式,另一種稱為保護方式。在實方式下,物理地址仍使用20位,所以最大定址空間為1MB,以便與8086兼容。保護方式採用32位物理地址,定址范圍可達4GB。
8. C語言中有哪些存儲類型
c語言中的存儲類型有auto, extern, register, static 這四種,存儲類型說明了該變數要在進程的哪一個段中分配內存空間,可以為變數分配內存存儲空間的有數據區、BBS區、棧區、堆區。
1. auto存儲類型
auto只能用來標識局部變數的存儲類型,對於局部變數,auto是默認的存儲類型,不需要顯示的指定。因此,auto標識的變數存儲在棧區中。
2. extern存儲類型
extern用來聲明在當前文件中引用在當前項目中的其它文件中定義的全局變數。如果全局變數未被初始化,那麼將被存在BBS區中,且在編譯時,自動將其值賦值為0,如果已經被初始化,那麼就被存在數據區中。全局變數,不管是否被初始化,其生命周期都是整個程序運行過程中,為了節省內存空間,在當前文件中使用extern來聲明其它文件中定義的全局變數時,就不會再為其分配內存空間。
3. register存儲類型
聲明為register的變數在由內存調入到CPU寄存器後,則常駐在CPU的寄存器中,因此訪問register變數將在很大程度上提高效率,因為省去了變數由內存調入到寄存器過程中的好幾個指令周期。
4. static存儲類型
被聲明為靜態類型的變數,無論是全局的還是局部的,都存儲在數據區中,其生命周期為整個程序,如果是靜態局部變數,其作用域為一對{}內,如果是靜態全局變數,其作用域為當前文件。靜態變數如果沒有被初始化,則自動初始化為0。靜態變數只能夠初始化一次。
9. C語言問題:內存的分配方式有哪幾種
1、靜態存儲區分配
內存分配在程序編譯之前完成,且在程序的整個運行期間都存在,例如全局變數、靜態變數等。
2、棧上分配
在函數執行時,函數內的局部變數的存儲單元在棧上創建,函數執行結束時這些存儲單元自動釋放。
3、堆上分配
堆分配(又稱動態內存分配)。程序在運行時用malloc或者new申請內存,程序員自己用free或者delete釋放,動態內存的生存期由我們自己決定。
(9)分配內存的存儲類別擴展閱讀
棧上分配數組
#include<iostream>
usingnamespacestd;
voidmain()
{
int**arr=NULL;//int型二維數組
introws,columns;
cin>>rows;//2
cin>>columns;//3
//請在此處編寫代碼,根據rows和columns在棧上分配一個數組arr
...你的代碼...
//賦值給數組元素
for(introwIndex=0;rowIndex<rows;rowIndex++)
{
for(intcolumnIndex=0;columnIndex<columns;columnIndex++)
{
arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1;
}
}
//列印每個數組元素
for(rowIndex=0;rowIndex<rows;rowIndex++)
{
for(intcolumnIndex=0;columnIndex<columns;columnIndex++)
{
printf("%d",arr[rowIndex][columnIndex]);
}
printf(" ");
}
}
10. 內存的分類
按內存條的介面形式,常見內存條有兩種:單列直插內存條(SIMM),和雙列直插內存條(DIMM)。SIMM內存條分為30線,72線兩種。DIMM內存條與SIMM內存條相比引腳增加到168線。DIMM可單條使用,不同容量可混合使用,SIMM必須成對使用。
按內存的工作方式,內存又有FPA EDO DRAM和SDRAM(同步動態RAM)等形式。
FPA(FAST PAGE MODE)RAM 快速頁面模式隨機存取存儲器:這是較早的電腦系統普通使用的內存,它每個三個時鍾脈沖周期傳送一次數據。
EDO(EXTENDED DATA OUT)RAM 擴展數據輸出隨機存取存儲器:EDO內存取消了主板與內存兩個存儲周期之間的時間間隔,他每個兩個時鍾脈沖周期輸出一次數據,大大地縮短了存取時間,是存儲速度提高30%。EDO一般是72腳,EDO內存已經被SDRAM所取代。
S(SYSNECRONOUS)DRAM 同步動態隨機存取存儲器:SDRAM為168腳,這是目前PENTIUM及以上機型使用的內存。SDRAM將CPU與RAM通過一個相同的時鍾鎖在一起,使CPU和RAM能夠共享一個時鍾周期,以相同的速度同步工作,每一個時鍾脈沖的上升沿便開始傳遞數據,速度比EDO內存提高50%。
DDR(DOUBLE DATA RAGE)RAM :SDRAM的更新換代產品,他允許在時鍾脈沖的上升沿和下降沿傳輸數據,這樣不需要提高時鍾的頻率就能加倍提高SDRAM的速度。
RDRAM(RAMBUS DRAM) 存儲器匯流排式動態隨機存取存儲器;RDRAM是RAMBUS公司開發的具有系統帶寬,晶元到晶元介面設計的新型DRAM,他能在很高的頻率范圍內通過一個簡單的匯流排傳輸數據。他同時使用低電壓信號,在高速同步時鍾脈沖的兩邊沿傳輸數據。INTEL將在其820晶元組產品中加入對RDRAM的支持。 由於這種內存的價格太過昂貴,在pc機上已經見不到他的蹤影。未來的內存是ddr2 和qbm的領域。