中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中動態內存的示例分析

發布時間:2022-03-07 15:08:12 來源:億速云 閱讀:136 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“C語言中動態內存的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C語言中動態內存的示例分析”這篇文章吧。

1.關于動態內存的函數

1.1 malloc和free函數

malloc這個函數向內存申請一塊連續可用的空間,并返回指向這塊空間的指針,如果開辟成功,則返回一個指向開辟好空間的指針;如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。

free函數專門是用來做動態內存的釋放和回收的。如果參數 ptr 指向的空間不是動態開辟的,那free函數的行為是未定義的;如果參數 ptr 是NULL指針,則函數什么事都不做。
 

C語言中動態內存的示例分析

C語言中動態內存的示例分析

說明:

該函數設計的巧妙的一點就是返回值為void*,因為函數創造者并不知道使用者是想以什么樣的類型指針來接收動態開辟的空間,所以使用者在使用時只需要強行轉換成自己想要的類型就可以:

int* p = (int*)malloc(40);//假設是整型時的例子

在使用完動態開辟的空間后記得要用free函數向操作系統釋放開辟的空間,并且將指針賦為空指針:

int* p = (int*)malloc(40);
 
//......
 
free(p);//避免內存泄漏
p = NULL;//原指針指向的位置既然已經還給操作系統的,就將指針賦為空指針,避免野指針等問題

 如果參數 size 為0,malloc的行為是標準是未定義的,取決于編譯器。

需要引頭文件stdlib.h

1.2 calloc函數

C語言中動態內存的示例分析

 calloc可與malloc函數相對照來學習,calloc函數的功能是為 num 個大小為 size 的元素開辟一塊空間,并且把空間的每個字節初始化為0。與malloc有兩點不同:

參數不同,calloc需要指明開辟空間的數據類型和該類型數據的個數,而malloc是全部字節數;

calloc在開辟空間的同時將空間內的全部字節初始化為0.

C語言中動態內存的示例分析

1.3 realloc函數

C語言中動態內存的示例分析

 realloc函數用來調整開辟空間的大小,有時可能開辟的空間小了,有時候可能開辟的大了,都可以通過realloc函數來修改,并且會將原來內存中的數據移動到新的空間。

realloc在調整空間大小時有兩種情況:

原有空間后有足夠大的空間,這種情況下擴展內存就直接原有內存之后直接追加空間,原來空間的數據不發生變化,返回值為原來位置的指針;

C語言中動態內存的示例分析

 2.原有空間后沒有足夠大的空間,這時便在堆空間找到大小合適的連續空間使用,并將原有空間的數據轉移到新的空間返回值為新空間的地址。

C語言中動態內存的示例分析

int main()
{
    int *str = (int*)malloc(10);
    if(str != NULL)
{
    //.....
}
else
{
    exit(EXIT_FAILURE);
}
    //擴展容量
//代碼1
str = (int*)realloc(str, 1000);//這樣可以嗎?(如果申請失敗會返回一個空指針!!!)
 
 
//修改代碼2
int*p = NULL;
p = realloc(str, 1000);
if(p != NULL)
{
    str = p;
}
//...
free(str);
return 0;
}

2.常見的動態內存錯誤

2.1 對NULL指針解引用

int* p = (int*)malloc(40);
*p=10;
free(p);

這就是忽略了返回值可能是空指針的可能,如果開辟失敗會返回空指針。所以最好的做法就是判斷一下指針是否為空,然后再進行下一步。

int* p = (int*)malloc(40);
if(p != NULL)
{
    *p=10;
}
free(p);

2.2 對動態內存開辟的空間越界訪問

就類似于使用數組時對數組越界訪問。

int i = 0;
int *p = (int *)malloc(10*sizeof(int));
if(NULL == p)
{
    exit(EXIT_FAILURE);
}
for(i=0; i<=10; i++)
{
    *(p+i) = i;//當i是10的時候越界訪問
}
free(p);

2.3 對非動態開辟內存使用free釋放

int a = 0;
int* p = &a;
free(p);

通過查閱MSDN可以發現:Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors. 就是說如果用free釋放非calloc,malloc,realloc函數動態開辟的空間可能會導致后續的分配請求并且導致錯誤。

2.4 使用free釋放一塊動態開辟內存的一部分

int *p = (int *)malloc(100);
p++;
free(p);//p不再指向動態內存的起始位置

會導致動態開辟的空間無法完全釋放,進而可能會導致內存泄漏。

2.5 對同一塊動態內存多次釋放

int *p = (int *)malloc(10);
free(p);
free(p);//重復釋放

2.6 內存泄漏

void test()
{
    int *p = (int *)malloc(100);
    if(NULL != p)
    {
        *p = 20;
    }
}
int main()
{
    test();
    return 0;
}

如果使用完動態內存又不釋放則會導致這塊內存無法在后續被利用,導致內存泄漏。動態開辟的空間一定要釋放,并且正確釋放。

補充:為什么要引入動態內存分配

1.指針只能指向一個確切的內存空間,欲使用一個數據,必須先設定一個變量來保存它么?

2.在程序設計時,數據多為動態的。即程序運行時數據項的數量是變化的。

3.用數組保存多個元素時,很難預知實際運行時存儲的元素個數,往往會導致預定義的元素個數不足或過多

例如:電話簿的管理程序。當添加新聯系人時,數據項將增加;刪除聯系人時,數據項將減少。

動態數據結構可以在運行時靈活地添加、刪除或重排數據項。
動態內存管理可以在運行時分配更多的內存空間或釋放掉不再需要的空間,因而可以優化存儲空間的使用。

所以&mdash;&mdash;&mdash;由于無法預知在運行時數組元素的使用情況,在程序中預定義的數組大小,如果過小,會導致程序運行失敗;如果過大,則會浪費內存空間。

如果在運行時根據實際需要來決定內存的使用情況,則可以很好的解決以上問題。

以上是“C語言中動態內存的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

炎陵县| 剑川县| 东明县| 孟津县| 泽州县| 易门县| 玉田县| 乃东县| 全州县| 特克斯县| 正定县| 旌德县| 莱州市| 布拖县| 满城县| 阳原县| 鸡东县| 寿宁县| 出国| 鹤岗市| 浦江县| 衡南县| 建阳市| 庐江县| 兴和县| 屏边| 梧州市| 云浮市| 伊春市| 稷山县| 宣武区| 罗田县| 桦甸市| 孟村| 南丰县| 南京市| 色达县| 沧州市| 青岛市| 永平县| 新巴尔虎左旗|