iOS學習筆記---c語言第十天

來源:互聯網
上載者:User

標籤:des   style   class   blog   code   tar   

動態記憶體分配

一、儲存區劃分

從低到高(記憶體位址小----記憶體位址大)  :  代碼區---常量區---靜態區---堆區---棧區

棧記憶體

 

//凡是在函數體內定義的變數 都儲存在棧區(包括形參)。    int a = 10;//a也是在棧地區裡面    float b = 1.5;//b也是在棧地區裡面    char c = ‘b‘;    double d = 3.14;    printf("%p %p %p %p\n",&a,&b,&c,&d);    //棧的特點先進後出,先定義的變數先入棧,後定義的變數後入棧。    //調用函數時。函數中得變數會陸續入棧,函數調用結束時,變數陸續出棧    //棧區記憶體的分配與回收,有系統自動進行。

 

常量區

‘a’字元常量     5整型常量       “iphone” 字串常量          

常量佔用記憶體 唯讀狀態   不能修改

靜態儲存區

static int a = 5;

1.只初始化一次    2.如果初始沒給值,預設為0   3.只有程式退出才釋放(永遠存在)

將變數定義的類型前加static  則該變數儲存在靜態儲存區

    //編譯期就已經進入記憶體,程式運行期間h一直存在,不會被銷毀  ,程式結束時h才會被銷毀,如果沒有給h賦值,h預設初始值為0    static int h = 10;

 

#import <Foundation/Foundation.h>int m = 100;//定義在函數外面的變數稱為全域變數,全域變數跟靜態變數一樣,儲存在全域區(也叫靜態區)int main(int argc, const char * argv[]){

二、堆記憶體配置函數 

 

堆記憶體 一般由程式員分配和釋放

malloc: void *malloc(unsigned int size);//void * 表示任意類型的指標

int * p = (int *)malloc(sizeof(int) * n);//(int *)強轉類型  sizeof(int)分配的記憶體大小 *n元素個數

char *str = malloc(8);

    //malloc主要功能是從 堆區 開闢 指定大小 得記憶體空間    //記憶體大小以 位元組 為單位    //傳回值是這段空間的首位置    //我們需要定義一個指標儲存傳回值    int *p = malloc(4);    //p在棧區。malloc操作的十堆區,p存的地址是堆區地址    int a = 10;    int *q = &a;    //a在棧區,q也在棧區,q存的a的地址,也就是棧區地址

 

strcpy(str, ”iPhone”);

free(str);//標記刪除,不清除內容

    struct student{        char name[20];        int age;        int num;        char sex;            };    typedef struct student  Student;    Student *pstu = malloc(sizeof(Student)*5);    pstu->age = 20;    free(pstu);//釋放記憶體,160個位元組歸還給系統

 

Student *p = malloc(sizeof(Student));//分配的記憶體大小要用 sizeof(Student)

void * calloc(unsigned n,unsigned size);//n記憶體個數 size大小    calloc 清空記憶體

//分配n個size大小的空間,並且把該記憶體上的所有位元組清零

void *realloc(void *p,unsigned newSize);//按新的長度重新分配

void *memset(void *s , int c , size_t n);//memset(p , 0 , sizeof(int) * 5)  通常用於清除結構體或者數組資料

 

    //輸入三個學員的姓名,動態分配記憶體儲存學院姓名,並最後輸出    //定義一個包含3個字元指標的數組,他們預設指向null(0)    char *names[3]={0};    //定義一個臨時數組,用於存放輸入的單個單詞    char temp[50] = {0};    for (int i = 0; i<3; i++) {        scanf("%s",temp);//temp前面不要加&,因為數組名本身就是地址        //擷取單個單詞的長度        unsigned long length = strlen(temp);        //讓指標指向開闢的堆空間        names[i] = malloc(length+1);        //將輸入的內容拷貝到堆空間裡        strcpy(names[i], temp);    }    for (int i = 0; i<3; i++) {        printf("%lu %s\n",strlen(names[i]),names[i]);free(names[i]);    
}

 void *memcpy(void *dest,const void *source,size_t n)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.