當前位置:首頁 » 服務存儲 » c加加程序中數據存儲在哪裡
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c加加程序中數據存儲在哪裡

發布時間: 2022-12-28 01:17:01

A. c語言編程中怎麼用文件存儲數據具體一點,謝謝

主要用C語言的庫函數,有open write read 或者是fopen fwrite fread這幾個函數,迅速就是先open 然後write,具體函數的用法可自行網路,如果你是問存儲數據的格式的話,自己定義結構體存儲的方式是最方便直接的

B. C語言如何保存程序內輸入的數據

先打開一個文件 FILE *fp=fopen("info.dat","w"); 然後fwrite()裡面的參數要看你如何定義了 你們沒有學文件操作嗎,老譚的書里有的,你可以去看看

C. 單片機用C語言編寫的程序說定義的數據都存放在哪了 向下面的一段定義的「U" 和「r」

num 放RAM中;

table[]放在ROM中

u,r 就是代表unsigned int,unsigned char意思,不佔空間

D. c語言中,常量是存放在內存中嗎

常量和變數是放在不同的"段"(section)里,程序一旦載入,常量/變數自然都在內存里。

在程序的運行過程中,把需要處理的數據存放在內存儲器中,稱始終保持不變的數據為「常量」,稱存放可變數據的存儲器單元為「變數」,其中的數據稱為變數的值。

整數是以補碼的形式轉換為二進制代碼存儲在計算機中。

實數是以IEEE754標准轉回換為二進制代答碼存儲在計算機中。

字元本質實際也與整數的存儲方式相同(先通過ASCII碼把字元轉換為對應的整數,再按整數以補碼形式轉換為二進制)。

(4)c加加程序中數據存儲在哪裡擴展閱讀:

在除了『C/C++』的一些高級程序語言中,『常量』可以被稱作,「在一個信息變化過程中,始終不發生改變的量」,其可以是不隨著時間變化的某些量的固定信息;也可以表示為某一數值的字元(或字元串),常被用來標識、測量和比較兩者的差異。

但在 『C/C++語言中』,『常量』如果還用『運行過程中不變的量』來描述,就顯得不太准確了,甚至是在具體使用時,這就是一個錯誤的概念。在 『C/C++』中,定義『指針常量』時,根據『const 』的位置的不同,可以定義出幾個不同的形式,雖然其看起來『符合常量的概念』,但是在實際運行中,其值或地址值是會發生變化的。所以本質還不是『常量概念』

E. 程序數據存儲在什麼地方

不過,寄存器的數量十分有限,所以寄存器是根據需要由編譯器適當地分配。作為一個程序員,我們對此沒有直接的控制權,也沒辦法在程序里頭感覺到寄存器的任何存在跡象。 Stack 棧位於一般的RAM(random-access memory,隨機訪問內存)中。處理器通過其指針(「棧指針」,stack pointer)獲得處理的直接支持。棧指針若向下(後)移,會分配新的內存;若向上(前)移,則會釋放那些內存。這是一種特別快、特別有效率的數據存儲方式,速度僅次於寄存器。由於Java編譯器有責任產生「將stack指針前後移動」的程序代碼,所以它必須能夠完全掌握它所編譯的程序中「存在stack里頭的所有數據的實際大小和存活時間」。如此一來便會限製程序的彈性。由於這個限制,盡管有些Java數據要存儲在棧里——特別是對象句柄,但Java對象並不放到其中。 Heap 堆Heap是一種通用性質的內存存儲空間(也存在於RAM中),用來置放所有Java對象。「內存堆」或「堆」(Heap)勝過stack之處在於,編譯器不需知道究竟得從堆里分配多少存儲空間,也不需知道從堆上分配的空間究竟要存活多長的時間。因此,用堆存儲數據時會得到更大的靈活性。要求創建一個對象時,只需用new即可。執行這些代碼時,會在堆里分配空間。當然,為達到這種靈活性,必然會付出一定的代價:在堆里分配存儲空間時會比從棧里分配花掉更長的時間(假設你真的可以在Java中像C++一樣地從stack上產生對象的話)! Static Storage 靜態存儲空間 這兒的「靜態」(Static)是指「位於固定位置」(也在RAM里頭)。靜態存儲空間存放著「程序運行期間」一直存在的數據。可用static關鍵字將某個對象內的特定成員設為靜態,但Java對象本身永遠都不會置入靜態存儲空間。 Constant Storage 常量存儲空間 常量值通常被直接置於程序代碼里頭。因為它們永遠都不會改變,所以也是安全的。有的常數需要嚴格地保護,所以可考慮將它們置入只讀存儲器(read-only memory,ROM)中。 Non-RAM Storage 非RAM存儲空間 若數據完全存活於程序之外,則程序不運行時數據仍繼續存在,脫離了程序的控制范圍。其中兩個最主要的例子便是「串流化對象(streamed objects)」和「持久性對象(persistent objects)」。在串流化對象形式中,對象會被轉換為一連串的位元組(bytes)流,這些bytes通常會被傳送給另一台機器。而在持久性對象形式中,對象被存儲於磁碟,即使程序運行結束,這些對象還能夠繼續保有。這種類型的存儲空間的特點在於,它們能夠將對象轉換為可存儲於其他媒介的形式,並在需要時,將所存儲的數據還原成可存儲於RAM中的一般對象。Java提供了對「輕量級持久性(Lightweight persistence)」的支持。新版本有可能提供更完善的解決方案。

F. C語言變數存儲在內存(memory)中的什麼地方

c語言中數據存儲分為以下幾個部分,每個部分存儲不同的內容:
1、棧區:存放函數的參數值,局部變數的值等。
2、堆區 :存儲動態生成的對象,一般由程序員分配釋放。
3、靜態區或者全局區: 存儲全局變數和靜態變數。
4、文字常量區 :存儲常量字元串。
5、代碼區 : 存儲函數體的2進制代碼。

G. C語言中的 局部變數,存儲在什麼地方

C語言中的局部變數存儲在棧里。

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

在棧空間上分配時是要注意內存的,不能分配內存過大。如果棧內空間小於所申請的空間大小,那麼這時系統將揭示棧溢出,並給出相應的異常信息。但是堆不一樣,堆可分配空間是很大的。

(7)c加加程序中數據存儲在哪裡擴展閱讀

局部變數分類

1、位置:靜態局部變數被編譯器放在全局存儲區.data,所以它雖然是局部的,但是在程序的整個生命周期中存在(定義時出生,隨著程序結束而結束)。

2、訪問許可權:靜態局部變數只能被其作用域內的變數或函數訪問。也就是說雖然它會在程序的整個生命周期中存在,由於它是static的,它不能被其他的函數和源文件訪問。

3、值:靜態局部變數如果沒有被用戶初始化,則會被編譯器自動賦值為0,以後每次調用靜態局部變數的時候都用上次調用後的值。

H. 誰能給我講一下C語言中程序以及各類型數據存儲位置

我想很多人也是糊塗,以下文章寫得很好,故全文轉來,慢慢體會。

程序的內存分配(堆和棧區別)

一、預備知識 程序的內存分配

一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack) 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap) 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static),全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程序結束後有系統釋放
4、文字常量區 ?常量字元串就是放在這里的。 程序結束後由系統釋放
5、程序代碼區?存放函數體的二進制代碼。
二、例子程序
這是一個前輩寫的,非常詳細
//main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20位元組的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}

二、堆和棧的理論知識

2.1申請方式
stack:
由系統自動分配。 例如,聲明在函數中一個局部變數 int b; 系統自動在棧中為b開辟空間
heap:
需要程序員自己申請,並指明大小,在c中malloc函數
如p1 = (char *)malloc(10);
在C++中用new運算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在棧中的。

2.2
申請後系統的響應
棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,
會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。

2.3申請大小的限制
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

2.4申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。

2.5堆和棧中的存儲內容
棧: 在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。
當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程序員安排。

2.6存取效率的比較

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以後的存取中,在棧上的數組比指針所指向的字元串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
對應的匯編代碼
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一種在讀取時直接就把字元串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據edx讀取字元,顯然慢了。

2.7小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大

一般認為在c中分為這幾個存儲區

1棧 - 有編譯器自動分配釋放
2堆 - 一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收
3全局區(靜態區),全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域,未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。- 程序結束釋放
4另外還有一個專門放常量的地方。 - 程序結束釋放
在函數體中定義的變數通常是在棧上,用malloc, calloc, realloc等分配內存的函數分配得到的就是在堆上。在所有函數體外定義的是全局量,加了static修飾符後不管在哪裡都存放在全局區(靜態區),在所有函數體外定義的static變數表示在該文件中有效,不能extern到別的文件用,在函數體內定義的static表示只在該函數體內有效。另外,函數中的"adgfdf"這樣的字元串存放在常量區。比如:

代碼:

int a = 0; //全局初始化區
char *p1; //全局未初始化區
main()
{

int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //123456\0在常量區,p3在棧上。
static int c = 0; //全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得來得10和20位元組的區域就在堆區。
strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊。
}

還有就是函數調用時會在棧上有一系列的保留現場及傳遞參數的操作。棧的空間大小有限定,vc的預設是2M。棧不夠用的情況一般是程序中分配了大量數組和遞歸函數層次太深。有一點必須知道,當一個函數調用完返回後它會釋放該函數中所有的棧空間。棧是由編譯器自動管理的,不用你操心。
堆是動態分配內存的,並且你可以分配使用很大的內存。但是用不好會產生內存泄漏。並且頻繁地malloc和free會產生內存碎片(有點類似磁碟碎片),因為c分配動態內存時是尋找匹配的內存的。而用棧則不會產生碎片。

在棧上存取數據比通過指針在堆上存取數據快些。一般大家說的堆棧和棧是一樣的,就是棧(stack),而說堆時才是堆heap。棧是先入後出的,一般是由高地址向低地址生長。

I. C++中各種數據成員,對象,函數等它們分別是存儲在哪裡的呢它們的生存期又是怎樣的謝謝!

只有當調用建函數(constructor)時才建立這個類的一個實體,並分配存儲單元,只有當刪除(destructor)這個實體時才取消存儲單元。

例如: 建函數, CMyView(), 它的destruction 函數 ~CMyView().

生存期是調用上述兩函數的時間之間。建--出生,刪(destruction)--消亡。

類內的數據成員生存期等於或短於類的生存期,因為你可能通過動態分配和動態刪除改變它們。

存儲在哪裡 -- 現代計算機都用虛擬存儲,即使是exe文件,也並不同時映射和裝入到RAM中去,類用到的動態鏈接庫,在共享區(如果已有別的進程用了)或新分配到共享區(如果沒有別的進程用,而是你的程序第一個使用,則新分)。

J. C語言的數據存儲位置

答案是~A~

不用管n是全局變數還是局部變數,變數只能存儲在數據存儲區,程序存儲區是保存程序用,堆棧是程序中斷是保存數據的數據存儲區域