c語言遍歷文件內容_C語言學習第28篇---動態內存分配剖析

91beeb4f6f46936a1e0085016e917328.png

為什么C語言要動態分配內存的意義?

1.C語言中的一切操作都是基于內存的

2.變量和數組都是內存的別名

---內存分配由編譯器在編譯期間決定的

---定義數組的時候必須指定數組長度

---數組長度是在編譯期就必須確定的

需求:程序運行的過程中,可能需要使用一些額外的內存空間

實際使用就是malloc和free函數

用于內存的分配和釋放

1.malloc所分配的是一塊連續的內存

2.malloc一字節為單位,并且不帶任何的類型信息

3.free用于將動態內存歸還系統

void* malloc(size_t size)

void free(void* pointer)

注意:

1.malloc和free是庫函數,不是系統調用

2.malloc實際分配的內存可能會比請求的多---有些編譯器分配時是以4字節為單元的

3.不能依賴于不同平臺的下的malloc

4.當請求的動態內存無法滿足時malloc返回的是NULL

5.當free的參數為NULL時,函數直接返回

思考一個問題:malloc*(0);返回值是什么?*(這也是一個面試題)

#include 

引出一個問題,這里不停的malloc,但是不free會造成內存泄露嗎?

答案是會的,因為現代編譯器一般是分配的4個整數字節,也就是申請的是0。但是實際分配的可能是4

解決的方式是:高級語言的(Java,.net.python等都是有內存回收功能的)

不過嵌入式基本都是使用C語言的(我做無人機的時候使用的是c++),那就得解決

下邊是一個實際操作---內存泄露檢測模塊

gcc 38-1.c mleak.c (編譯需要的所有文件)

#include 

怎么實現內存檢測的呢?

mleak.c函數

#include 

mleak.h

#ifndef _MLEAK_H_

新概念

calloc和realloc

1.malloc的同胞兄弟

void* calloc(size_t num,size_t size);

void* realloc(void* pointer,size_t new_size);

2.calloc的參數代表所返回的內存的類型信息

---calloc會將=返回的內存初始化為0

3.realloc用于修改一個原先已經分配好的內存塊的大小

---在使用realloc之后應該使用期返回值

---當pointer的第一個參數時NULL時,等價于malloc

實例使用:

#include 

小結:

1.動態分配內存是C語言的強大功能

2.程序能夠在需要的時候有機會使用更多的內存

3.malloc單純的從系統中申請固定字節大小的內存

4.calloc能以類型大小為單位申請內存并初始化為0

5.relloc用于重置內存大小

說明

1.該文檔僅供個人學習使用,版權所有,禁止商用。

2.本文由我一個人編輯并整理,難免存在一些錯誤。

3.為了方便大家平時公交、地鐵、外出辦事也能用手機隨時隨地查看該教程,該教程同步更新于微信公眾號『Allen5G』。

我的微信公眾號(ID:Allen5G)主要分享軟件工程師進階(嵌入式,Linux,C/C++,python,英語),程序員職業發展,如果想查看更多內容,可以關注我的微信公眾號『Allen5G』

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542752.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

重啟mysql的命令 linux_linux重啟mysql命令

如何啟動/停止/重啟MySQL一、 啟動方式1、使用 service 啟動:service mysqld start2、使用 mysqld 腳本啟動:/etc/inint.d/mysqld start3、使用 safe_mysqld 啟動:safe_mysqld&二、停止1、使用 service 啟動:service mysqld s…

tomcat 多項目多HOST配置

一、場景&#xff1a;使用一個tomcat部署多個項目&#xff0c;并且分別使用不同域名進行訪問。二、詳細配置tomcat/conf/server.xml 中寫<Engine name"Catalina" defaultHost"localhost">***********************************<Host name"biz…

javascript原型_使用JavaScript的示例報告卡Web應用程序原型

javascript原型Hi! At times, beginners always find it hard getting the application of the theory they learn In programming or a particular language. 嗨&#xff01; 有時&#xff0c;初學者總是很??難在編程或特定語言中應用他們學到的理論。 In this article, we…

vb.net cad 塊表最后的實體_21個繪圖命令+7個技巧,3分鐘讓你成為CAD高手

繪制圖紙需要用到CAD&#xff0c;CAD制圖在生活中也是廣泛運用&#xff0c;那么學習CAD到底難不難呢&#xff1f;在這里要告訴CAD新手們&#xff0c;世上無難事&#xff0c;可以用3分鐘讓你成為CAD高手。21個繪圖命令A&#xff1a;繪圓弧B&#xff1a;定義塊C&#xff1a;畫圓D…

本地tomcat啟動war包_「shell腳本」懶人運維之自動升級tomcat應用(war包)

準備&#xff1a;提前修改war包里的相關配置&#xff0c;并上傳到服務器&#xff1b;根據要自動升級的tomcat應用修改或添加腳本相關內容&#xff1b;tomcat啟動腳本如是自己寫的&#xff0c;要統一格式命名&#xff0c;如&#xff1a;xxx、xxxTomcat 等&#xff1b;拿到生產使…

python將txt轉為字符串_python做第一只小爬蟲

“受盡苦難而不厭&#xff0c;此乃修羅之路”本文技術含量過低&#xff0c;請謹慎觀看之前用R語言的Rcurl包做過爬蟲&#xff0c;給自己的第一感覺是比較費勁&#xff0c;看著看著發際線就愈加亮眼&#xff0c;最后果斷丟之。不過好的是和python爬取原理基本一致&#xff0c;且…

c#查找列表指定元素的索引_在集合的指定索引處插入元素 在C#中

c#查找列表指定元素的索引Given a Collection<T> of Integer and we have to insert an element at given index. 給定Integer的Collection <T>&#xff0c;我們必須在給定的索引處插入一個元素。 To insert an element in Collection<T>, we use Insert() …

跨域技術(JSONP與CROS)

JSONP 我們發現&#xff0c;Web頁面上調用js文件時不受是否跨域的影響&#xff0c;凡是擁有"src"這個屬性的標簽都擁有跨域的能力&#xff0c;比如<script>、<img>、<iframe>。那就是說如果要跨域訪問數據&#xff0c;就服務端只能把數據放在js格式…

python3 array為什么不能放不同類型的數據_小白入門Python數據科學全教程lt;一gt;...

前言本文講解了從零開始學習Python數據科學的全過程&#xff0c;涵蓋各種工具和方法你將會學習到如何使用python做基本的數據分析你還可以了解機器學習算法的原理和使用說明先說一段題外話。我是一名數據科學家&#xff0c;在用SAS做分析超過5年后&#xff0c;我決定走出舒適區…

c winform 上傳文件到mysql_C# winform DevExpress上傳圖片到數據庫【轉】

實現功能如下圖&#xff1a;注明&#xff1a;此文使用的是DevExpress控件&#xff0c;winform 原生控件也是一樣使用方法。1.點擊選擇圖片按鈕&#xff0c;功能為通過對話框選擇要上傳的文件&#xff0c;并將該文件在下面的PictureEdit中顯示出來。具體代碼如下&#xff1a;pri…

V 8 nfs+drbd+heartbeat

V 8 nfsdrbdheartbeatnfsdrbdheartbeat&#xff0c;nfs或分布式存儲mfs只要有單點都可用此方案解決在企業實際生產場景中&#xff0c;nfs是中小企業最常用的存儲架構解決方案之一&#xff0c;該架構方案部署簡單、維護方便&#xff0c;只需通過配inotifyrsync簡單而高效的數據同…

nodemailer使用_如何使用Nodemailer使用HTML作為內容發送電子郵件 Node.js

nodemailer使用Prerequisite: 先決條件&#xff1a; How to send emails using Nodemailer | Node.js 如何使用Nodemailer發送電子郵件。 Node.js How to send emails with attachments using Nodemailer | Node.js 如何使用Nodemailer發送帶有附件的電子郵件。 Node.js This …

angularjs 元素重復指定次數_[LeetCode] 442. 數組中重復的數據

[LeetCode] 442. 數組中重復的數據題目鏈接&#xff1a; https://leetcode-cn.com/problems/find-all-duplicates-in-an-array難度&#xff1a;中等通過率&#xff1a;61.5%題目描述:給定一個整數數組 a&#xff0c;其中1 ≤ a[i] ≤ n &#xff08; n 為數組長度&#xff09;,…

docker 安裝mysql 實戰文檔_docker 安裝mysql

PassJava (佳必過) 項目全套學習教程連載中&#xff0c;關注公眾號第一時間獲取。docker 安裝mysql1.下載鏡像sudo docker pull mysql:5.7ubuntuVM-0-13-ubuntu:~$ sudo docker pull mysql:5.75.7: Pulling from library/mysqlc499e6d256d6: Pull complete22c4cdf4ea75: Pull c…

python 補前導零_Python正則表達式| 程序從IP地址中刪除前導零

python 補前導零Given an IP address as input, write a Python program to remove leading zeros from it. 給定一個IP地址作為輸入&#xff0c;編寫一個Python程序以從中刪除前導零。 Examples: 例子&#xff1a; Input: 216.08.094.196Output: 216.8.94.196Input: 216.08…

眼球追蹤

眼球追蹤類似于頭部追蹤&#xff0c;但是圖像的呈現取決于使用者眼睛所看的方向。例如&#xff0c;人們可以用“眼神”完成一種鐳射槍的瞄準。眼球追蹤技術很受VR專家們密切關注。Oculus創始人帕爾默拉奇就曾稱其為“VR的心臟”。對于人眼位置的檢測&#xff0c;能夠為當前所處…

mysql 創建分區表_Mysql分區表及自動創建分區Partition

Range分區表建表語句如下&#xff0c;其中分區鍵必須和id構成主鍵和唯一鍵CREATE TABLE test1 (id char(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ‘自增主鍵(guid)‘,create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘創建時間‘,partition_key …

python下載文件暫停恢復_Python關于Threading暫停恢復解決辦法

我們都知道python中可以是threading模塊實現多線程, 但是模塊并沒有提供暫停, 恢復和停止線程的方法, 一旦線程對象調用start方法后, 只能等到對應的方法函數運行完畢. 也就是說一旦start后, 線程就屬于失控狀態. 不過, 我們可以自己實現這些. 一般的方法就是循環地判斷一個標志…

信息系統狀態過程圖_過程狀態圖中使用的重要術語| 操作系統

信息系統狀態過程圖1)上下文切換 (1) Context Switching) Whenever a process is transferred within the system, it moves within different states. These states are known as the process states. When a process goes from one state to another state inside the system…

mysql 吧庫下的表名都加_mysql數據庫表名大小寫問題

mysql數據庫表名大小寫問題mysql數據庫linux版本表名、字段名默認大小寫敏感&#xff0c;即區分大小寫。查看mysql有關大小寫參數&#xff1a;lower_case_file_system是一個只讀參數&#xff0c;無法被修改&#xff0c;這個參數是用來告訴你在當前的系統平臺(linux\windows等)下…