當前位置:首頁 » 編程語言 » c語言靜態存儲區
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言靜態存儲區

發布時間: 2022-05-29 11:22:27

A. 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。靜態變數只能夠初始化一次。

B. C語言問題:內存的分配方式有哪幾種

1、靜態存儲區分配

內存分配在程序編譯之前完成,且在程序的整個運行期間都存在,例如全局變數、靜態變數等。

2、棧上分配

在函數執行時,函數內的局部變數的存儲單元在棧上創建,函數執行結束時這些存儲單元自動釋放。

3、堆上分配

堆分配(又稱動態內存分配)。程序在運行時用malloc或者new申請內存,程序員自己用free或者delete釋放,動態內存的生存期由我們自己決定。

(2)c語言靜態存儲區擴展閱讀

棧上分配數組

#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(" ");

}

}

C. c++全局/靜態存儲區和常量存儲區是一樣的嗎

當然不一樣,下面詳細講解一下內存分配的幾個區:
棧:
就是那些由編譯器在需要的時候分配,
在不需要的時候自動清除的變數的存儲區。
裡面的變數通常是局部變數、函數參數等。
在一個進程中,位於用戶虛擬地址空間頂部
的是用戶棧,編譯器用它來實現函數的調用。
和堆一樣,用戶棧在程序執行期間可以動態地擴展和收縮。

堆:
就是那些由new分配的內存塊,他們的釋放編譯器不去管,
由我們的應用程序去控制,一般一個new就要對應一個delete。
如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
堆可以動態地擴展和收縮。

自由存儲區,
就是那些由malloc等分配的內存塊,他和堆是十分相似的,
不過它是用free來結束自己的生命的。

全局/靜態存儲區,
全局變數和靜態變數被分配到同一塊內存中,
在以前的C語言中,全局變數又分為初始化的
和未初始化的(初始化的全局變數和靜態變數在一塊區域,
未初始化的全局變數與靜態變數在相鄰的另一塊區域,
同時未被初始化的對象存儲區可以通過void*來訪問和操縱,
程序結束後由系統自行釋放),在C++裡面沒有這個區分了,
他們共同佔用同一塊內存區。

常量存儲區,
這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改

D. C語言中變數的存儲類型有哪幾種,存儲方式哪幾種謝嘍

在C語言中,對變數的存儲類型說明有以下四種:

1、auto 自動變數

2、register 寄存器變數

3、extern 外部變數

4、static 靜態變數

所謂存儲類型是指變數佔用內存空間的方式,也稱為存儲方式。

變數的存儲方式可分為「靜態存儲」和「動態存儲」兩種。

1、靜態存儲變數通常是在變數定義時就在存儲單元並一直保持不變,直至整個程序結束。

2、動態存儲變數是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。

如果一個函數被多次調用,則反復地分配、釋放形參變數的存儲單元。從以上分析可知,靜態存儲變數是一直存在的,而動態存儲變數則時而存在時而消失。

(4)c語言靜態存儲區擴展閱讀:

變數根據定義的位置的不同的生命周期,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,類作用域,命名空間作用域和文件作用域。

一、從作用域看:

1、全局變數具有全局作用域。全局變數只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變數的定義的源文件需要用extern關鍵字再次聲明這個全局變數。

2、靜態局部變數具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束一直存在,它和全局變數的區別在於全局變數對所有函數都是可見的,而靜態局部變數只對定義自己的函數體始終可見。

3、局部變數也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束後,變數被撤銷,其所佔用的內存也被收回。

4、靜態全局變數也具有全局作用域,它與全局變數的區別在於如果程序包含多個文件的話,它作用於定義它文件里,不能作用到其他文件里,即被static關鍵字修飾過的變數具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變數,它們也是不同的變數。

二、從分配空間看:

全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間。

全局變數本身就是靜態存儲方式,靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。

而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一個源程序的其他源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。

1、靜態變數會放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。

2、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。

參考資料來源:網路-變數-存儲類型

E. 在C語言中,什麼是動態存儲,什麼是靜態存儲

動態存儲是auto關鍵字,例如我們定義的int
a;
默認就是動態存儲,具體應該是
auto
int
a;一般是用於函數參數,局部變數,超出作用域范圍會失效,變數產生在動態存儲區
靜態存儲時static關鍵字,例如,我們定義一個
static
int
a;
就是存儲在靜態存儲區,相當於一個全局變數
一樓的理解出現了問題

F. C語言中 局部變數和全局變數都是存儲在什麼區

C語言中局部變數存在棧里,全局變數存靜態存儲區。

局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。

全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;

(6)c語言靜態存儲區擴展閱讀

C語言中局部變數和全局變數示例:

#include<stdio.h>

#include<malloc.h>

staticints1=0,s2=0,s3=0;//靜態變數放在靜態區

intg1=0,g2=0,g3=0;//全局變數放在靜態區

voidmain()

{

staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//靜態變數

inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部變數放在棧區

charc1[]="aabb";//局部變數放在棧區

char*c2="aabb";//字元常量放在靜態區

char*m1=(char*)malloc(1);//堆區

char*m2=(char*)malloc(1);//堆區

char*m3=(char*)malloc(1);//堆區

printf("動態數據區 ");

printf("a1 a2 a3 ",&a1,&a2,&a3);

printf("c1 ",c1);

printf("m1 m2 m3 ",&m1,&m2,&m3);

printf("靜態數據區 ");

printf("s1 s2 s3 ",&s1,&s2,&s3);

printf("g1 g2 g3 ",&g1,&g2,&g3);

printf("s4 s5 s6 ",&s4,&s5,&s6);

printf("c2 ",c2);

}

G. c語言中全局變數都是靜態儲存的嗎

不太嚴格的說,可以這么認為。
因為全局變數和靜態變數在內存里是儲存在一個地方的。叫
data
segment
(數據段),靜態區。意思是這個地方的數據的生命周期是不變的,只要程序本身在運行,他們就會存在。所以說他們都存在同一片區域內。
你能想到
靜態變數

全局變數
在使用的時候有什麼區別嗎?唯一的區別就是對於多個文件的訪問許可權,static
的變數只對本文件有效,而全局變數(除去const)對當前所有文件有效。main.cpp
可以訪問
foo.cpp
的全局變數,而不能訪問
foo.cpp
的靜態變數。
既然他們存在一個地方,如何區分呢。通過變數的
linkage
(即能否被鏈接器識別)屬性,internal
linkage
的變數只能被本文件訪問,而
external
linkage
的變數可以被其他文件訪問。就這個層面而言,你的想法不能說有錯。

H. C語言動態和靜態存儲類別的區別

主要區別在於存儲區域和作用時間。
C語言的數據區分為靜態存儲區與動態存儲區。
靜態存儲是指在程序運行期間給變數分配固定存儲空間的方式。如全局變數存放在靜態存儲區中,程序運行時分配空間,程序運行完釋放。
動態存儲是指在程序運行時根據實際需要動態分配存儲空間的方式。如形式參數存放在動態存儲區中,在函數調用時分配空間,調用完成釋放。

I. C語言指針申明的變數都存儲在靜態區嗎

  1. 首先在C語言中,所有的字元串(注意不是數組字元串),都屬於靜態儲存類別的,也就是C規定字元串必須為存放在靜態棧。

  2. 你用指針str指向了"helloworld"的地址,所以str也是指導了靜態棧之中,如果你用數組來聲明字元串就不會是這個樣子了。

    char str[ ]="helloworld":表示首先在靜態棧創建"helloworld",然後再把靜態棧的字元串字面量(就是字元串的內容)拷貝到str數組之中;

  3. 你用 p指向了整數10的地址,指針是存放在動態棧中的,一旦遇到{號就被清空了,直到下一次被調用

J. C語言中全局變數的儲存類別是

C語言中全局變數的儲存類別是靜態存儲區。

由某對象或某個函數所創建的變數通常都是局部變數,只能被內部引用,而無法被其它對象或函數引用。

全局變數既可以是某對象函數創建,也可以是在本程序任何地方創建。全局變數是可以被本程序所有對象或函數引用。



(10)c語言靜態存儲區擴展閱讀:

使用全局變數會佔用更多的內存(因為其生命期長),不過在計算機配置很高的今天,這個不應該算什麼問題,除非使用的是巨大對象的全局變數,能避免就一定要避免。

使用全局變數程序運行時速度更快一些(因為內存不需要再分配),同樣也快不了多少。對於局部變數的名字空間污染,這個在不使用太多變數時是可以避免的。

當全局變數與局部變數重名的時候,起作用的是局部變數,全局變數被屏蔽掉。還可以用extern在函數外對全局變數聲明,使全局變數的作用域從聲明處到文件的結束。