字串,指標,記憶體分配,函式呼叫

2021-07-23 06:35:58 字數 2087 閱讀 2069

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 編譯器將應用程式的記憶體空間分成四個部分...

陣列 指標和字串 動態記憶體分配和釋放

動態記憶體分配最常見的就是用來分配乙個某型別的陣列 我們可以使用陣列來處理大量的資料,但實際上很多情況下我們並不知道此陣列會有多少個元素,所以在定義陣列時到底定義多大的陣列就要仔細考慮下了。比如,我們要對輸入的若干個數進行分析,得出所有的正數存到乙個陣列裡以備他用,這個正數陣列應該定義多大呢?如果大...