一段關於變數與記憶體空間佔用的對話
來源:互聯網
上載者:User
老丁-廈門(43515273) 2012/2/12 4:45:54
#include <iostream>
#include <iomanip>
using namespace std;void copystr(char *str1,char *str2)
{
for(;*str2!='\0';str1++,str2++)
*str1=*str2;
*str1='\0';
}void main()
{
char a[10];//如果把這句換成:char *a="ghi";就會發生錯誤,為什麼?
char *b="abc";
copystr(a,b);
cout<<"a="<<a<<endl;
}
廈門英智-黃雙全(962017) 10:33:56
局部變數都是分配在棧裡面,比如定義char * a,的棧中佔用一個指標的大小
char a[10],佔用10個位元組的大小,有些系統為了對齊,會佔用12個位元組的大小
棧中的內容是可以改變的不過,char * a="ghi";其實是分成兩部份,char * a和"ghi",其中char *a在棧中,佔用了四個位元組,而"ghi"則是是分配在代碼區裡面,也就是和程式碼是在一塊區裡面
所以不能夠改變它char * a= "ghi";
char * b="abc";
a= b; 是正確定的,因為a是在棧裡面,改變的是a這個指標四個位元組的內容
copy b to a 是錯誤的,因為這個動作是要用abc來覆蓋ghi這三個字元,而ghi這三個字元是在代碼區裡面記憶體中,分為四種,一種是代碼空間,一種是資料空間(包括全域變數,局變數(棧),還有就是堆空間)
代碼空間是不允許改變的,受系統何護,而資料空間,則是都可以改變的 郭志順(513367429) 10:41:02
char a[] = "hello";
char a[10] = "hello";
這兩個都儲存在哪裡啊? 老丁-廈門(43515273) 10:41:38
char a[] = "hello";
char a[10] = "hello";
這兩個都儲存在哪裡啊?
儲存在堆裡 廈門英智-黃雙全(962017) 10:42:36
char a[]佔用了6個位元組空間,如果是局部變數,則分配在棧裡面,"hello"佔用6個位元組,藏在代碼裡面,在程式啟動並執行時候,有個初始化動作,會"hello"這個位置的內容,拷到char a[]這個位置去
會佔用兩份空間,一份是佔用程式空間,一份是佔用資料空間,只是編譯器自動加了一個拷貝動作進去 老丁-廈門(43515273) 10:44:14
堆棧,老和單片機的區分不開,單片機的堆棧就是這裡的棧,慣性思維 廈門英智-黃雙全(962017) 10:44:23
char a[10]佔用了10位元組的資料空間,"hello"佔用了6個位元組的代碼空間 郭志順(513367429) 10:45:49
那是不是還有拷貝行為 廈門英智-黃雙全(962017) 10:47:23
資料空間的佔用,根據你定義方式的不同,而不同,可能會儲存在“全域變數(全域空間,程式編譯完後,大小是固定的),局變數(棧)”兩種情況,如果需要存堆中,則需要調用malloc手動分配記憶體,再對它進行賦值
是的,是還有拷貝行為
所有對變數的初始化,都有一個拷貝行為 廈門英智-黃雙全(962017) 10:48:33
變數定義,在程式運行過程中,分定義和賦值過程,初始化,就是把定義和賦值寫在一行代碼中而己 郭志順(513367429) 10:49:00
嗯,明白了,非常的透徹
這些知識是屬於編譯原理裡面的嗎? 廈門英智-黃雙全(962017) 10:52:10
有部份編譯原理的知識,也有系統及硬體體繫結構相關的知識