靜態儲存區問題

2021-04-12 16:28:19 字數 706 閱讀 6074

先貼上一段程式,如下:

1 #include

2 int  main()

3 {4     char a="hello";

5     a[0]='x';

6     cout<

上面的程式選自"高質量c++程式設計",這個程式中對p的內容修改是錯誤的,結果是segment fault.

書中的解釋是這樣的:"world"字串是位於靜態儲存區,內容不可變.

本人認為這樣的解釋不夠確切.這裡對記憶體分配的分類不夠詳細.全域性變數和static變數也是位於靜態儲存區,但是卻可以改變其置.

它對記憶體分配的方式分了5種.

1、棧區(stack)—   由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2、堆區(heap) —   一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放 

4、文字常量區  —常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區—存放函式體的二進位制**。

上面例子中的"world"就是位於文字常量區,不能改變其內容.  

堆疊靜態儲存區

1 從靜態儲存區域分配 內存在程式編譯時就已經分配好,這塊內存在程式的整個執行期間都存在。速度快 不容易出錯,因為有系統會善後。例如全域性變數,static變數等。靜態變數分為區域性靜態變數和全域性靜態變數,注意區分,區域性靜態變數不是全域性變數 靜態全域性變數的作用域僅限於當前原始檔,靜態區域性變...

記憶體儲存 全域性 靜態儲存區 常量儲存區

全域性 靜態儲存區 全域性變數和靜態變數被分配到同一塊記憶體中 常量儲存區 存放的是常量,是不允許修改的。靜態儲存是main函式執行前分配記憶體並初始化 常量儲存是固化在執行檔案上的資料。棧的方向和平台有關,一般來說,windows由高位址向低位址增長,linux相反,但基於linux的第三方系統得...

堆,棧,靜態儲存區和常量儲存區

在c 中,記憶體分成4個區,他們分別是堆,棧,靜態儲存區和常量儲存區 1 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的存 儲區.裡面的變數通常是區域性變數,函式引數等.2 堆,又叫自由儲存區,它是在程式執行的過程中動態分配的,它最大的特性就是動.態性.由new分配的記憶體塊,...