本文介紹在
ubuntu12.10
,g++
環境下c++
記憶體分配問題。並由此解釋在用g++
編譯時,
字串常量賦值給字元指標型別時提示
「warning:deprecated conversion from string constant to 'char *'
」警告的原因
。c++編譯器將應用程式的記憶體空間分成四個部分,從記憶體低位址開始依次為:**和常量區(用於儲存唯讀的**資料和常量值)、全域性變數和靜態變數區(用於儲存全域性變數和靜態變數)、堆區
(用於儲存
new、
malloc
申請的記憶體)、棧區(用於儲存函式返回位址、區域性變數等)。
我們將用如下**來測試我們的假設:
view source
print?
01.
#include
02.
#include
03.
#include
04.
#include
05.
06.
using
namespace
std;
07.
08.
int
quanju;
/*全域性變數,全域性區/靜態區(static)*/
09.
void
fun(
int
f_jubu);
/***區*/
10.
int
main(
void
)
11.
46.
void
fun(
int
f_jubu)
47.
實驗結果:
hello
fun字串常量(
hello
): 0x8048c58
main兩個區的主要區別在於以下幾個方面:字串常量(
hello
): 0x8048c58
main
字串常量(hw)
: 0x8048c5e
main
靜態整型常量
: 0x8048e64
main
函式**位址
: 0x80487dc
fun函式**位址
: 0x8048a73
fun靜態變數
: 0x804a0f8
main
靜態變數
: 0x804a0fc
全域性變數
: 0x804a0f0
main
字串(堆分配)
: 0x9ed0008
fun形參變數
: 0xbfe0e8b0
fun區域性變數
: 0xbfe0e89c
main
函式函式指標變數
: 0xbfe0e8d4
main
區域性變數
: 0xbfe0e8c8
main
區域性變數
: 0xbfe0e8d0
main
區域性變數
: 0xbfe0e8cc
main
區域性變數(
const
修飾):0xbfe879d8
1、管理方式不同;棧是一塊連續的記憶體空間,具有後進先出的特點因此不存在記憶體碎片,而且計算機底層直接提供支援,分配效率高。無需程式設計師管理,編譯器會自動申請和釋放。2、空間大小不同;
3、能否產生碎片不同;
4、生長方向不同;
5、分配方式不同;
6、分配效率不同;
堆的管理方式一般是採用鍊錶管理可用的記憶體塊,當使用者申請一塊記憶體時,系統從可用記憶體塊中查詢一塊滿足要求的記憶體空間分配給使用者使用;使用者釋放記憶體後,系統將其**。因此堆的記憶體管理需要由程式設計師來進行,分配效率不如棧。
在用g++作編譯器時,將字串常量賦值給指標變數將得到
「warning
:deprecated conversion from string constant to 'char *'
」的警告。例如:
char*ptrst = 「hello」;
這是因為將字元指標變數
ptrst指向乙個位於常量區的字串常量「
hello」。如果在執行時修改
ptrst指向記憶體的值,例如:
ptrst[0]= 'j',將會丟擲異常,在
linux的
g++下,丟擲了「
segmentation fault」的異常。
因此我們在將乙個字串常量賦值給字元指標變數時
,應該將該變數限定為
const
型,即const char*
。如果需要在**中修改字元指標指向的變數的值,應該採用如下兩種方式:
view source
print?
1.
chars = 「hello」;
2.
char
*ptrst = s;
或者view source
print?
1.
char
*ptrst = (
char
*)
malloc
(
sizeof
(
char
) * 6);
2.
strcpy
(ptrst,「hello」);
字串的的記憶體分配
package com.mypractice.second public class equalstest 執行結果 總結 1.使用string str1 new string aaa 進行字串賦值時,會直接給該段字串分配記憶體空間。即使再string str2 new string aaa str...
C 字串的記憶體分配與駐留池
剛開始學習c 的時候,就聽說clr對於string類有一種特別的記憶體管理機制 有時候,明明宣告了兩個string類的物件,但是他們偏偏卻指向同乙個例項。如下 string s1 hello string s2 hello s2和s1的實際值都是 hello bool same object s1 ...
字串,指標,記憶體分配,函式呼叫
1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 亦稱動態記憶體分配。程式在執行的時候用malloc 或new申請任意多少的記憶體,生命週期有程式設計師自己決定在何時用free 或d...