1、棧區(stack)由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。
2、堆區(heap)一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。亦稱動態記憶體分配。程式在執行的時候用malloc
或new申請任意多少的記憶體,生命週期有程式設計師自己決定在何時用free
或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。
3、全域性區資料區—靜態儲存區,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另 一塊區域。 程式結束後由系統釋放。
4、全域性資料區-文字常量區—儲存在唯讀資料區,常量字串就是放在這裡的。程式結束後由系統釋放 。因此字串常量不可改變
5、程式**區—存放函式體的二進位制**。
二、例子程式
int a = 0;
全域性初始化區
char *p1;
全域性未初始化區
main()
char p1=」hello」;
p1[0]=』a』;//可以,指標指向字串陣列記憶體應為儲存在棧上,可以改變
char *p2=」hello」;
p2[0]=』a』;//錯誤,指標指向字串儲存在文字常量區,不可改變。
char *p=newchar[n];//指標指向堆
p="helloworld"; //錯誤將乙個文字常量區賦給乙個指向堆的指標,記憶體區域不符合,所以錯誤 /
char *str="hello";
char *p=(char *)malloc(6);
strcpy(p,str);
printf("%s\n",str);//字串複製,遇『\0』結束。將字串常量複製到p指向的堆記憶體區是可以的。輸出:hello /
char *str="hello";
char *p=(char *)malloc(6);
memcpy(p,str,6);//資料複製,不指定資料型別
printf("%s\n",p);//正確,輸出:hello
函式返回值:函式呼叫完後,會有乙個變數儲存返回值,而不像區域性變數釋放了。
#include
char *getmemory();
int main()
char *getmemory()
//#include
char *getmemory();
int main()
char *getmemory()
#include
#include
char *getmemory();
int main()
char *getmemory()
// 下面看乙個經典例子:
#include
#include
void getmemory(char *p,int num);
int main()
void getmemory(char *p,int num)
修改:#include
#include
char *getmemory(char *p,int num);
int main()
char *getmemory(char *p,int num)
///
或者用指標的指標:
#include
#include
void getmemory(char **p,int num);
int main()
void getmemory(char **p,int num)
/ #include
#include
void getmemory(int *z);
int main()
void getmemory(int *z)
字串的的記憶體分配
package com.mypractice.second public class equalstest 執行結果 總結 1.使用string str1 new string aaa 進行字串賦值時,會直接給該段字串分配記憶體空間。即使再string str2 new string aaa str...
C 記憶體分配及字串賦值
本文介紹在 ubuntu12.10 g 環境下c 記憶體分配問題。並由此解釋在用g 編譯時,字串常量賦值給字元指標型別時提示 warning deprecated conversion from string constant to char 警告的原因 c 編譯器將應用程式的記憶體空間分成四個部分...
陣列 指標和字串 動態記憶體分配和釋放
動態記憶體分配最常見的就是用來分配乙個某型別的陣列 我們可以使用陣列來處理大量的資料,但實際上很多情況下我們並不知道此陣列會有多少個元素,所以在定義陣列時到底定義多大的陣列就要仔細考慮下了。比如,我們要對輸入的若干個數進行分析,得出所有的正數存到乙個陣列裡以備他用,這個正數陣列應該定義多大呢?如果大...