" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C語(yǔ)言動(dòng)態(tài)內(nèi)存的分配

 更新時(shí)間:2021年12月31日 15:54:40   作者:Alienware^  
這篇文章主要為大家介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存的分配,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

C 程序中,不同數(shù)據(jù)在內(nèi)存中分配說(shuō)明

1)全局變量——內(nèi)存中的靜態(tài)存儲(chǔ)區(qū)

2)非靜態(tài)的局部變量——內(nèi)存中的動(dòng)態(tài)存儲(chǔ)區(qū)——stack 棧

3)臨時(shí)使用的數(shù)據(jù)—建立動(dòng)態(tài)內(nèi)存分配區(qū)域,需要時(shí)隨時(shí)開(kāi)辟,不需要時(shí)及時(shí)釋放——heap 堆

4)根據(jù)需要向系統(tǒng)申請(qǐng)所需大小的空間,由于未在聲明部分定義其為變量或者數(shù)組,不能通過(guò)變量名或者數(shù)組名 來(lái)引用這些數(shù)據(jù),只能通過(guò)指針來(lái)引用)

在這里插入圖片描述

內(nèi)存動(dòng)態(tài)分配的相關(guān)函數(shù)

1)頭文件#include 聲明了四個(gè)關(guān)于內(nèi)存動(dòng)態(tài)分配的函數(shù)

2)函數(shù)原型 void * malloc(usigned int size) //memory allocation

  • 作用——在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)(堆區(qū))中分配一個(gè)長(zhǎng)度為 size 的連續(xù)空間。
  • 形參 size 的類(lèi)型為無(wú)符號(hào)整型,函數(shù)返回值是所分配區(qū)域的第一個(gè)字節(jié)的地址,即此函數(shù)是一個(gè)指針型函數(shù), 返回的指針指向該分配域的開(kāi)頭位置。
  • malloc(100); 開(kāi)辟 100 字節(jié)的臨時(shí)空間,返回值為其第一個(gè)字節(jié)的地址

3)函數(shù)原型void *calloc(unsigned n,unsigned size)

作用——在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配 n 個(gè)長(zhǎng)度為 size 的連續(xù)空間,這個(gè)空間一般比較大,足以保存一個(gè)數(shù)組用 calloc 函數(shù)可以為一維數(shù)組開(kāi)辟動(dòng)態(tài)存儲(chǔ)空間,n 為數(shù)組元素個(gè)數(shù),每個(gè)元素長(zhǎng)度為 size.函數(shù)返回指向所分配域的起始位置的指針;分配不成功,返回 NULL。p = calloc(50, 4); //開(kāi)辟 50*4 個(gè)字節(jié)臨時(shí)空間,把起始地址分配給指針變量 p

4)函數(shù)原型:void free(void *p)

作用——釋放變量 p 所指向的動(dòng)態(tài)空間,使這部分空間能重新被其他變量使用。p 是最近一次調(diào)用 calloc 或 malloc 函數(shù)時(shí)的函數(shù)返回值free 函數(shù)無(wú)返回值free (p ); // 釋放 p 所指向的已分配的動(dòng)態(tài)空間

5) 函數(shù)原型void *realloc(void *p,unsigned int size)

作用——重新分配 malloc 或 calloc 函數(shù)獲得的動(dòng)態(tài)空間大小,將 p 指向的動(dòng)態(tài)空間大小改變?yōu)?size,p 的值不 變,分配失敗返回 NULLrealloc(p, 50); // 將 p 所指向的已分配的動(dòng)態(tài)空間 改為 50 字節(jié)

6)返回類(lèi)型說(shuō)明
 

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

應(yīng)用實(shí)例

動(dòng)態(tài)創(chuàng)建數(shù)組,輸入 5 個(gè)學(xué)生的成績(jī),另外一個(gè)函數(shù)檢測(cè)成績(jī)低于 60 分的,輸出不合格的成績(jī)。

代碼演示

#include <stdlib.h>
#include <stdio.h>
int main() {
	void check(int *);
	int * p,i; // 在堆區(qū)開(kāi)辟一個(gè) 5 * 4 的空間,并將地址 (void *) , 轉(zhuǎn)成 (int *) , 賦給 p
	p = (int *)malloc(5*sizeof(int));
	for( i = 0; i < 5; i++) {
		scanf("%d", p + i);
	}
	check(p); //
	free(p); //銷(xiāo)毀 堆區(qū) p 指向的空間 getchar(); getchar();
	return 0;
}
void check(int *p) {
	int i;
	printf("\n不及格的成績(jī) 有: ");
	for(i =0; i < 5; i++) {
		if(p[i] < 60) {
			printf(" %d ", p[i]);
		}
	}
}

動(dòng)態(tài)分配內(nèi)存的基本原則

1)避免分配大量的小內(nèi)存塊。分配堆上的內(nèi)存有一些系統(tǒng)開(kāi)銷(xiāo),所以分配許多小的內(nèi)存塊比分配幾個(gè)大內(nèi)存塊的 系統(tǒng)開(kāi)銷(xiāo)大

2)僅在需要時(shí)分配內(nèi)存。只要使用完堆上的內(nèi)存塊,就需要及時(shí)釋放它(如果使用動(dòng)態(tài)分配內(nèi)存,需要遵守原則: 誰(shuí)分配,誰(shuí)釋放), 否則可能出現(xiàn)內(nèi)存泄漏

3)總是確保釋放以分配的內(nèi)存。在編寫(xiě)分配內(nèi)存的代碼時(shí),就要確定在代碼的什么地方釋放內(nèi)存

4)在釋放內(nèi)存之前,確保不會(huì)無(wú)意中覆蓋堆上已分配的內(nèi)存地址,否則程序就會(huì)出現(xiàn)內(nèi)存泄漏。在循環(huán)中分配內(nèi) 存時(shí),要特別小心

5)指針使用一覽

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)推箱子小游戲

    C語(yǔ)言實(shí)現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 基于C++實(shí)現(xiàn)日期計(jì)算器的詳細(xì)教程

    基于C++實(shí)現(xiàn)日期計(jì)算器的詳細(xì)教程

    在現(xiàn)代社會(huì)中,計(jì)算器已經(jīng)進(jìn)入了每一個(gè)家庭,人們?cè)谏詈蛯W(xué)習(xí)中經(jīng)常需要使用到計(jì)算器,下面這篇文章主要給大家介紹了關(guān)于基于C++實(shí)現(xiàn)日期計(jì)算器的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • C語(yǔ)言內(nèi)存管理及初始化細(xì)節(jié)示例詳解

    C語(yǔ)言內(nèi)存管理及初始化細(xì)節(jié)示例詳解

    這篇文章主要為大家介紹了C語(yǔ)言內(nèi)存管理及初始化細(xì)節(jié)示例的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C++實(shí)現(xiàn)連連看消除算法

    C++實(shí)現(xiàn)連連看消除算法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)連連看消除算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 淺析成員函數(shù)和常成員函數(shù)的調(diào)用

    淺析成員函數(shù)和常成員函數(shù)的調(diào)用

    下面小編就為大家?guī)?lái)一篇淺析成員函數(shù)和常成員函數(shù)的調(diào)用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換算法(FIFO、LRU)

    C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換算法(FIFO、LRU)

    這篇文章主要介紹了通過(guò)C語(yǔ)言實(shí)現(xiàn)的兩種頁(yè)面置換算法:先進(jìn)先出(FIFO)頁(yè)面置換算法和最近最久未使用(LRU)頁(yè)面置換算法。文中的代碼具有一定的學(xué)習(xí)或工作價(jià)值,快來(lái)跟隨小編學(xué)習(xí)一下吧
    2021-12-12
  • C++ 靜態(tài)成員的類(lèi)內(nèi)初始化詳解及實(shí)例代碼

    C++ 靜態(tài)成員的類(lèi)內(nèi)初始化詳解及實(shí)例代碼

    這篇文章主要介紹了C++ 靜態(tài)成員的類(lèi)內(nèi)初始化詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C/C++?string.h庫(kù)中memcpy()和memmove()的使用

    C/C++?string.h庫(kù)中memcpy()和memmove()的使用

    memcpy與memmove的目的都是將N個(gè)字節(jié)的源內(nèi)存地址的內(nèi)容拷貝到目標(biāo)內(nèi)存地址中,本文主要介紹了C/C++?string.h庫(kù)中memcpy()和memmove()的使用,感興趣的可以了解一下
    2023-12-12
  • 詳解C++中特殊類(lèi)設(shè)計(jì)

    詳解C++中特殊類(lèi)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++中關(guān)于特殊類(lèi)設(shè)計(jì)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,感興趣的可以了解一下
    2023-07-07
  • C++讀取文件的四種方式總結(jié)

    C++讀取文件的四種方式總結(jié)

    C++可以根據(jù)不同的目的來(lái)選取文件的讀取方式,C++中有四種常見(jiàn)的讀取方式,本文主要介紹了這四種方法的具體實(shí)現(xiàn),需要的可以參考一下
    2023-04-04

最新評(píng)論