日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言内存分配与释放 不同类别变量的内存分配和释放的区别

發布時間:2025/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言内存分配与释放 不同类别变量的内存分配和释放的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.不同變量使用內存的區別

  • 靜態存儲類別的變量:內存數量在編譯時確定,程序開始執行時創建,程序結束時銷毀。(static、const)
  • 自動存儲類別的變量:程序進入變量定義所在塊時存在,離開塊時銷毀。新創建的變量按順序加入內存,然后以相反的順序銷毀,類似棧。
  • 動態分配內存的變量:內存在調用malloc()或相關函數時存在,調用free()后釋放內存。
  • 程序把靜態對象、自動對象、動態分配的對象存儲在不同的區域。
  • 2.為什么要動態分配內存

    大多數情況程序使用的數組小于100個元素,但有時程序需要100000個元素,如果直接聲明一個內含100000個元素的數組,這樣做浪費內存。
    所以通過動態分配內存,使程序更加靈活

    3.free在動態內存分配的作用——防止內存泄漏

    double *a =(double*)malloc(n*sizeof(double))

    函數結束,作為自動變量的指針a消失,但他指向的n*sizeof(double)字節的內存仍然存在,而且由于指針a已經被銷毀,所以無法訪問這塊內存,這塊內存也不能被重復使用。

    所以需要用free釋放動態分配的內存

    4.free和malloc用法

    free和malloc原型都在stdlib.h頭文件中

    malloc()返回類型通常為指向char的指針,從ANSI C標準開始,C使用一個新的類型,指向void的指針。所以通常malloc函數的返回值會被強制轉換為匹配的類型。

    double *p; p=(double *)malloc(30*sizeof(double));

    指針p被聲明為指向一個double類型,可以像使用數組名一樣使用它,這里分配的是連續的內存塊,指針指向已分配塊中的第一個結構。

    free()函數的參數是之前malloc()返回的地址,因此參數也應是一個指針。該函數釋放之前malloc()分配的內存。

    free(p);

    5.例子-通訊錄排序

    習題9-5 通訊錄排序 (20 分)
    輸入n個朋友的信息,包括姓名、生日、電話號碼,本題要求編寫程序,按照年齡從大到小的順序依次輸出通訊錄。題目保證所有人的生日均不相同。

    輸入格式:
    輸入第一行給出正整數n(<10)。隨后n行,每行按照“姓名 生日 電話號碼”的格式給出一位朋友的信息,其中“姓名”是長度不超過10的英文字母組成的字符串,“生日”是yyyymmdd格式的日期,“電話號碼”是不超過17位的數字及+、-組成的字符串。

    輸出格式:
    按照年齡從大到小輸出朋友的信息,格式同輸出。

    輸入樣例:
    3
    zhang 19850403 13912345678
    wang 19821020 +86-0571-88018448
    qian 19840619 13609876543
    結尾無空行
    輸出樣例:
    wang 19821020 +86-0571-88018448
    qian 19840619 13609876543
    zhang 19850403 13912345678
    結尾無空行

    5.1代碼

    #include<stdio.h> #include<stdlib.h> struct people{char name[11];long long birth;char phonenum[20]; };int main(){struct people *p,temp;int n,i,j;scanf("%d",&n);p=(struct people *)malloc(n*sizeof(struct people));//分配空間for(i=0;i<n;++i){scanf("%s %lld %s",&p[i].name,&p[i].birth,&p[i].phonenum);}for(i=0;i<n;++i){for(j=i+1;j<n;++j){if(p[i].birth>p[j].birth){//排序temp=p[i];p[i]=p[j];p[j]=temp;}}}for(i=0;i<n;++i){if(i==0)printf("%s %lld %s",p[i].name,p[i].birth,p[i].phonenum);else printf("\n%s %lld %s",p[i].name,p[i].birth,p[i].phonenum);}free(p);//釋放 } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的c语言内存分配与释放 不同类别变量的内存分配和释放的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。