最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言深入講解動態(tài)內存分配函數的使用

 更新時間:2022年05月11日 11:23:39   作者:GG_Bond18  
這篇文章主要介紹了C語言動態(tài)內存分配,C語言內存管理相關的函數主要有realloc、calloc、malloc、free、柔性數組等,下面這篇文章帶大家了解一下

局部變量和函數的形參向棧區(qū)申請空間

全局變量和static靜態(tài)變量向靜態(tài)區(qū)申請空間

動態(tài)內存分配向堆區(qū)申請空間(位于<stdlib.h>或<cstdlib>頭文件)

一、malloc

void* malloc (size_t size);

分配內存塊

分配一個連續(xù)可用的字節(jié)內存塊,返回指向該內存塊開頭的指針。

新分配的內存塊的內容未初始化,內存塊中的數據為不確定值。

如果為參數為零,則返回值取決于特定的庫實現(它可能是空指針,也可能不是空指針)。

參數

內存塊的大小,以字節(jié)為單位。

是無符號整數類型,size_t。

返回值

成功時,為指向函數分配的內存塊的指針。

此指針的類型始終為void*,可以將其轉換為所需的數據指針類型。(C++由于其類型檢查更為嚴格,則必須進行強制類型轉換)

如果函數未能分配請求的內存塊,則返回空指針NULL。

#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
int main()
{
    int* p = (int*)malloc(10 * sizeof(int));
    if (p == NULL)
    {
        printf("%s\n", strerror(errno));
    }
    else
    {
        for (int i = 0; i < 10; ++i)
        {
            *(p + i) = i;
        }
        for (int i = 0; i < 10; ++i)
        {
            printf("%d ", *(p + i));
        }
    }
    free(p);
    p = NULL;
    /*
    1.斷開指針與動態(tài)開辟的空間的聯系,避免指針的危險操作
    2.防止對同一塊動態(tài)空間內存空間的重復釋放
    */
    return 0;
}

輸出

0 1 2 3 4 5 6 7 8 9

二、free(用于釋放動態(tài)開辟的空間)

void free(void* ptr);

解除分配內存塊

1.若參數ptr指向的空間不是動態(tài)開辟的,那么free函數的行為是未定義的。

2.若參數ptr是NULL指針,則free函數什么也不做。

3.free只釋放堆區(qū)空間,但ptr仍指向那塊空間。所以使用完free后要將ptr置為NULL,切斷ptr與該內存塊的聯系。

參數

指向要釋放的那塊空間的指針(必須指向初始位置)

返回值

錯誤案例

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* p = (int*)malloc(sizeof(int) * 10);
    if (p == NULL)
    {
        return 1;
    }
    for (int i = 0; i < 10; ++i)
    {
        *(p + i) = i;
    }
    for (int i = 0; i < 10; ++i)
    {
        printf("%d ", *(p++));//這里指針移動
    }
    free(p);//導致free釋放的不是初始位置的指針,程序崩潰
    p = NULL;
    return 0;
}

三、calloc

void* calloc(size_t num,size_t num);

分配和零初始化內存塊

1.函數的功能是為num個大小為size的元素開辟空間。

2.與malloc的區(qū)別只在于calloc會在返回地址前將申請的空間的每個字母初始化為0。

#include <stdio.h>      /* printf, scanf, NULL */
#include <stdlib.h>     /* calloc, exit, free */
int main ()
{
  int i,n;
  int * pData;
  printf ("Amount of numbers to be entered: ");
  scanf ("%d",&i);
  pData = (int*) calloc (i,sizeof(int));
  if (pData==NULL) exit (1);
  for (n=0;n<i;n++)
  {
    printf ("Enter number #%d: ",n+1);
    scanf ("%d",&pData[n]);
  }
  printf ("You have entered: ");
  for (n=0;n<i;n++) printf ("%d ",pData[n]);
  free (pData);
  return 0;
}

四、realloc

void* realloc(void* ptr,size_t size);

重新分配內存塊

1.ptr為要調整的內存空間,size為調整后的新大小

2.返回值為調整后的內存塊的起始位置

注意事項

1.若ptr指向的空間之后有足夠的空間可以追加,則直接追加,然后返回ptr。

2.若ptr指向的空間之后沒有足夠的內存空間,則realloc函數會重新找一塊內存空間,開辟一塊滿足需求的內存空間,并且把原來內存中的數據拷貝過來,釋放舊的內存空間,最后返回新開辟的內存空間的地址。

#include <stdio.h>      /* printf, scanf, puts */
#include <stdlib.h>     /* realloc, free, exit, NULL */
int main ()
{
  int input,n;
  int count = 0;
  int* numbers = NULL;
  int* more_numbers = NULL;
  do {
     printf ("Enter an integer value (0 to end): ");
     scanf ("%d", &input);
     count++;
 
     more_numbers = (int*) realloc (numbers, count * sizeof(int));
 
     if (more_numbers!=NULL) {
       numbers=more_numbers;
       numbers[count-1]=input;
     }
     else {
       free (numbers);
       puts ("Error (re)allocating memory");
       exit (1);
     }
  } while (input!=0);
  printf ("Numbers entered: ");
  for (n=0;n<count;n++) printf ("%d ",numbers[n]);
  free (numbers);
  return 0;
}

五、常見的動態(tài)內存分配錯誤

1.對NULL指針的解引用操作(要進行返回值的判斷)

2.對動態(tài)開辟空間的越界訪問

3.對非動態(tài)開辟內存的空間的使用free進行釋放

4.使用free釋放一塊動態(tài)開辟內存的一部分

(若指針位置發(fā)生變化,歸位后再進行釋放)

5.對同一塊動態(tài)內存的多次釋放

6.動態(tài)開辟內存忘記釋放(內存泄漏)

六、柔性數組

C99中,結構體中的最后一個元素是未知大小的數組,被稱為柔性數組成員。

特點

1.結構體中柔性數組成員前必須至少有一個其他成員。

2.sizeof返回的這種結構體的大小不包括柔性數組的內存大小。

3.包含柔性數組成員的結構體用malloc函數進行內存動態(tài)內存的動態(tài)分配,并且分配的內存應大于結構體的大小,以適應柔性數組的預期大小。

優(yōu)勢

1.方便內存釋放。

2.利于訪問速度,減少內存碎片。

#include<stdio.h>
#include<stdlib.h>
struct S
{
    int n;
    int arr[];
};
int main()
{
    struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
    //給arr分配內存20個字節(jié)的空間
    if (ps == NULL)
    {
        return 1;
    }
    //……………………操作
    free(ps);
    ps = NULL;
    return 0;
}

到此這篇關于C語言深入講解動態(tài)內存分配函數的使用的文章就介紹到這了,更多相關C語言動態(tài)內存分配內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Qt掃盲篇之QRegExp正則匹配類總結

    Qt掃盲篇之QRegExp正則匹配類總結

    這篇文章主要給大家介紹了關于Qt掃盲篇之QRegExp正則匹配類總結的相關資料,QRegExp是Qt框架中的一個類,用于進行正則表達式的匹配和處理,它提供了多種模式來匹配不同的字符串,需要的朋友可以參考下
    2023-12-12
  • c語言中回調函數的使用以及實際作用詳析

    c語言中回調函數的使用以及實際作用詳析

    回調函數就是一個通過函數指針調用的函數,如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數,這篇文章主要給大家介紹了關于c語言中回調函數的使用以及實際作用的相關資料,需要的朋友可以參考下
    2021-07-07
  • C++實現高并發(fā)異步定時器

    C++實現高并發(fā)異步定時器

    這篇文章主要為大家詳細介紹了如何利用C++實現高并發(fā)異步定時器,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • EasyX繪制透明背景圖的方法詳解

    EasyX繪制透明背景圖的方法詳解

    這篇文章主要為大家詳細介紹了EasyX繪制透明背景圖的方法,文中的示例代碼講解詳細,對我們深入了解EasyX有一定的幫助,需要的可以參考一下
    2023-01-01
  • 基于Qt實現系統(tǒng)主題感知功能

    基于Qt實現系統(tǒng)主題感知功能

    在現代桌面應用程序開發(fā)中,系統(tǒng)主題感知是一項重要的功能,它使得應用程序能夠根據用戶的系統(tǒng)主題設置(如深色模式或淺色模式)自動調整其外觀,Qt 作為一個跨平臺的C++圖形用戶界面應用程序開發(fā)框架,提供了豐富的工具和類來實現這一功能,需要的朋友可以參考下
    2024-12-12
  • C++中std::partial_sort的使用小結

    C++中std::partial_sort的使用小結

    std::partial_sort?是?C++?標準庫中的一個算法,它可以對容器中的一部分元素進行排序,本文主要介紹了C++中std::partial_sort的使用小結,感興趣的可以了解一下
    2025-04-04
  • C語言字符串函數,字符函數,內存函數使用及模擬實現

    C語言字符串函數,字符函數,內存函數使用及模擬實現

    這篇文章主要介紹了C語言字符串函數,字符函數,內存函數使用及模擬實現,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Qt中QSettings配置文件的讀寫和應用場景詳解

    Qt中QSettings配置文件的讀寫和應用場景詳解

    這篇文章主要給大家介紹了關于Qt中QSettings配置文件的讀寫和應用場景的相關資料,QSettings能讀寫配置文件,當配置文件不存在時,可生成配置文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • C++中vector容器使用詳細說明

    C++中vector容器使用詳細說明

    在c++中,vector是一個十分有用的容器,下面通過本文給大家介紹C++中vector容器使用詳細說明,需要的朋友可以參考下
    2016-10-10
  • 詳解C++中的指針結構體數組以及指向結構體變量的指針

    詳解C++中的指針結構體數組以及指向結構體變量的指針

    這篇文章主要介紹了C++中的指針結構體數組以及指向結構體變量的指針的用法,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09

最新評論

寿阳县| 德阳市| 二连浩特市| 巴青县| 拉萨市| 崇文区| 苗栗市| 屏山县| 社旗县| 清水县| 孟津县| 施甸县| 阳谷县| 原平市| 安乡县| 阿拉善盟| 墨玉县| 海门市| 信宜市| 丰台区| 绍兴县| 堆龙德庆县| 密云县| 林州市| 淮南市| 元朗区| 临夏县| 荥经县| 宜城市| 垣曲县| 大邑县| 鲁山县| 页游| 荥经县| 山东省| 津市市| 日喀则市| 屏边| 白城市| 色达县| 榆社县|