RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言中的動(dòng)態(tài)內(nèi)存管理

電子工程師 ? 來(lái)源:未知 ? 作者:李倩 ? 2018-11-12 14:46 ? 次閱讀

本章將講解 C 中的動(dòng)態(tài)內(nèi)存管理。C語(yǔ)言為內(nèi)存的分配和管理提供了幾個(gè)函數(shù)。這些函數(shù)可以在頭文件中找到。

注意:void * 類型表示未確定類型的指針。C、C++ 規(guī)定 void * 類型可以通過(guò)類型轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換為任何其它類型的指針。

動(dòng)態(tài)分配內(nèi)存

編程時(shí),如果您預(yù)先知道數(shù)組的大小,那么定義數(shù)組時(shí)就比較容易。例如,一個(gè)存儲(chǔ)人名的數(shù)組,它最多容納 100 個(gè)字符,所以您可以定義數(shù)組,如下所示:

char name[100];

但是,如果您預(yù)先不知道需要存儲(chǔ)的文本長(zhǎng)度,例如您向存儲(chǔ)有關(guān)一個(gè)主題的詳細(xì)描述。在這里,我們需要定義一個(gè)指針,該指針指向未定義所需內(nèi)存大小的字符,后續(xù)再根據(jù)需求來(lái)分配內(nèi)存,如下所示:

#include

#include

#includeintmain()

{ charname[100];

char *description; strcpy(name, "Zara Ali"); /* 動(dòng)態(tài)分配內(nèi)存 */ description = (char *)malloc(200 * sizeof(char));

if(description == NULL) { fprintf(stderr, "Error - unable to allocate required memory\n");

} else { strcpy(description, "Zara ali a DPS student in class 10th");

} printf("Name = %s\n", name);

printf("Description: %s\n", description);

}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Name=ZaraAliDescription:Zara ali a DPS student inclass10th

上面的程序也可以使用calloc()來(lái)編寫,只需要把 malloc 替換為 calloc 即可,如下所示:

calloc(200,sizeof(char));

當(dāng)動(dòng)態(tài)分配內(nèi)存時(shí),您有完全控制權(quán),可以傳遞任何大小的值。而那些預(yù)先定義了大小的數(shù)組,一旦定義則無(wú)法改變大小。

重新調(diào)整內(nèi)存的大小和釋放內(nèi)存

當(dāng)程序退出時(shí),操作系統(tǒng)會(huì)自動(dòng)釋放所有分配給程序的內(nèi)存,但是,建議您在不需要內(nèi)存時(shí),都應(yīng)該調(diào)用函數(shù)free()來(lái)釋放內(nèi)存。

或者,您可以通過(guò)調(diào)用函數(shù)realloc()來(lái)增加或減少已分配的內(nèi)存塊的大小。讓我們使用 realloc() 和 free() 函數(shù),再次查看上面的實(shí)例:

#include

#include

#includeintmain()

{ charname[100];

char *description; strcpy(name, "Zara Ali"); /* 動(dòng)態(tài)分配內(nèi)存 */ description = (char *)malloc(30 * sizeof(char));

if(description == NULL) { fprintf(stderr, "Error - unable to allocate required memory\n");

} else { strcpy(description, "Zara ali a DPS student.");

} /* 假設(shè)您想要存儲(chǔ)更大的描述信息 */ description = realloc(description, 100 * sizeof(char));

if(description == NULL) { fprintf(stderr, "Error - unable to allocate required memory\n");

} else { strcat(description, "She is in class 10th");

} printf("Name = %s\n", name);

printf("Description: %s\n", description); /* 使用 free() 函數(shù)釋放內(nèi)存 */ free(description);

}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Name=ZaraAliDescription:Zara ali a DPS student.Sheisinclass10th

您可以嘗試一下不重新分配額外的內(nèi)存,strcat() 函數(shù)會(huì)生成一個(gè)錯(cuò)誤,因?yàn)榇鎯?chǔ) description 時(shí)可用的內(nèi)存不足。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136685
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4327

    瀏覽量

    62569
  • 內(nèi)存管理
    +關(guān)注

    關(guān)注

    0

    文章

    168

    瀏覽量

    14134

原文標(biāo)題:C語(yǔ)言中的內(nèi)存管理

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    動(dòng)態(tài)內(nèi)存管理模塊的設(shè)計(jì)原理與實(shí)現(xiàn)

    Fense 通過(guò)設(shè)立一個(gè)雙向鏈表(struct Head *stHead)來(lái)保存所有被分配的動(dòng)態(tài)內(nèi)存塊的信息。鏈表中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)動(dòng)態(tài)內(nèi)存塊,節(jié)點(diǎn)中包括此內(nèi)存大小、分配發(fā)生時(shí)所在的源文件名和行號(hào)
    的頭像 發(fā)表于 06-30 08:05 ?2349次閱讀
    <b class='flag-5'>動(dòng)態(tài)內(nèi)存</b><b class='flag-5'>管理</b>模塊的設(shè)計(jì)原理與實(shí)現(xiàn)

    C語(yǔ)言知識(shí)總結(jié):動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存分配就 是指在程序執(zhí)行的過(guò)程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。動(dòng)態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)
    發(fā)表于 10-24 15:52 ?855次閱讀

    使用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)內(nèi)存分配

    首先要明白為何需要動(dòng)態(tài)內(nèi)存分配,熟悉C語(yǔ)言的讀者應(yīng)該對(duì)這個(gè)比較熟悉,需要一段內(nèi)存時(shí)會(huì)使用malloc函數(shù)來(lái)申請(qǐng)所需要大小的內(nèi)存,函數(shù)返回一段
    發(fā)表于 07-28 16:26 ?642次閱讀
    使用<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>實(shí)現(xiàn)簡(jiǎn)單<b class='flag-5'>動(dòng)態(tài)內(nèi)存</b>分配

    C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理知識(shí)

    概述:C語(yǔ)言的優(yōu)勢(shì)是可以直接訪問(wèn)內(nèi)存地址,也就是指針操作,但其缺陷也是因?yàn)橹苯?b class='flag-5'>內(nèi)存訪問(wèn)。如何通過(guò)防御性編程提前發(fā)現(xiàn)問(wèn)題,盡可能減少內(nèi)存異常產(chǎn)
    發(fā)表于 09-22 09:54 ?519次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>的<b class='flag-5'>動(dòng)態(tài)內(nèi)存</b><b class='flag-5'>管理</b>知識(shí)

    C語(yǔ)言程序設(shè)計(jì)中動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn)

    C語(yǔ)言程序設(shè)計(jì)中,動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn),需要注意哪些問(wèn)題?
    發(fā)表于 09-28 16:53 ?1353次閱讀

    第28章 FreeRTOS動(dòng)態(tài)內(nèi)存管理

    轉(zhuǎn): 本章節(jié)為大家講解FreeRTOS動(dòng)態(tài)內(nèi)存管理,動(dòng)態(tài)內(nèi)存管理是FreeRTOS非常重要的一項(xiàng)功能,前面章節(jié)講解的任務(wù)創(chuàng)建、信號(hào)量、消息隊(duì)列、事件標(biāo)志組、互斥信號(hào)量、軟件定時(shí)器組等需
    發(fā)表于 09-11 07:15

    動(dòng)態(tài)內(nèi)存管理的原理詳解

    C/C++語(yǔ)言與其他語(yǔ)言不同,它需要開發(fā)者自己管理內(nèi)存資源。對(duì)于
    發(fā)表于 11-02 09:25

    【原創(chuàng)】C語(yǔ)言中動(dòng)態(tài)內(nèi)存-----棧內(nèi)存

    作者:蔡琰老師(張飛實(shí)戰(zhàn)電子高級(jí)工程師)C語(yǔ)言程序的動(dòng)態(tài)內(nèi)存分為棧內(nèi)存區(qū)域和堆內(nèi)存區(qū)域兩種。棧內(nèi)存
    發(fā)表于 07-07 14:18

    請(qǐng)問(wèn)使用動(dòng)態(tài)內(nèi)存分配安全嗎?

    想在C語(yǔ)言程序員之間開始一個(gè)激烈的,或者說(shuō)有爭(zhēng)議的討論很簡(jiǎn)單,只需要問(wèn):“使用動(dòng)態(tài)內(nèi)存分配安全嗎?”使用動(dòng)態(tài)內(nèi)存分配安全嗎?在C
    發(fā)表于 12-15 06:10

    使用動(dòng)態(tài)內(nèi)存分配安全嗎

    [導(dǎo)讀]想在C語(yǔ)言程序員之間開始一個(gè)激烈的,或者說(shuō)有爭(zhēng)議的討論很簡(jiǎn)單,只需要問(wèn):“使用動(dòng)態(tài)內(nèi)存分配安全嗎?”想在C語(yǔ)言程序員之間開始一個(gè)激烈
    發(fā)表于 12-15 07:44

    一個(gè)動(dòng)態(tài)內(nèi)存管理模塊的實(shí)現(xiàn)

    介紹一個(gè)動(dòng)態(tài)內(nèi)存管理模塊,可以有效地檢測(cè)C程序中內(nèi)存泄漏和寫內(nèi)存越界等錯(cuò)誤,適用于具有標(biāo)準(zhǔn)C
    發(fā)表于 04-16 14:18 ?14次下載

    一個(gè)動(dòng)態(tài)內(nèi)存管理模塊的實(shí)現(xiàn)

    介紹一個(gè)動(dòng)態(tài)內(nèi)存管理模塊,可以有效地檢測(cè)C程序中內(nèi)存泄漏和寫內(nèi)存越界等錯(cuò)誤,適用于具有標(biāo)準(zhǔn)C
    發(fā)表于 05-14 14:39 ?10次下載

    動(dòng)態(tài)內(nèi)存錯(cuò)誤的靜態(tài)檢測(cè)

    內(nèi)存泄漏、空指針引用等動(dòng)態(tài)內(nèi)存錯(cuò)誤在/,/LL等支持動(dòng)態(tài)內(nèi)存操作的程序中普遍存在在程序中,動(dòng)態(tài)內(nèi)存管理錯(cuò)誤是導(dǎo)致
    發(fā)表于 06-10 16:29 ?52次下載
    <b class='flag-5'>動(dòng)態(tài)內(nèi)存</b>錯(cuò)誤的靜態(tài)檢測(cè)

    嵌入式C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理動(dòng)態(tài)內(nèi)存分配

    動(dòng)態(tài)內(nèi)存管理同時(shí)還具有一個(gè)優(yōu)點(diǎn):當(dāng)程序在具有更多內(nèi)存的系統(tǒng)上需要處理更多數(shù)據(jù)時(shí),不需要重寫程序。
    發(fā)表于 08-15 17:16 ?2279次閱讀

    C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理講解

    本章將講解 C 中的動(dòng)態(tài)內(nèi)存管理。C 語(yǔ)言內(nèi)存的分配和管理
    的頭像 發(fā)表于 02-23 14:03 ?390次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>的<b class='flag-5'>動(dòng)態(tài)內(nèi)存</b><b class='flag-5'>管理</b>講解
    RM新时代网站-首页