學習筆記12-C語言-堆內存、字符串

什么是堆內存:

是進程中的一個內存段(text\data\bss\heap\stack),由程序猿手動控制。
特點是足夠大,缺點是使用麻煩

為什么要使用堆內存:

1、隨著程序的復雜,數據會越來越多。
2、其他的內存段的申請和釋放不受控制,堆內存的申請釋放受程序猿控制

如何使用堆內存:

注意:在C語言中沒有控制堆內存的語句,只能使用C標準庫中的函數void *malloc(size_t size);malloc(4);
功能:從堆內存中申請size個字節的內存,申請的內存中存儲的內容不確定
size: 表示要申請的字節數大小
返回值:成功時返回成功申請到的內存的首地址,失敗時返回NULLvoid free(void *ptr);
功能:釋放一塊內存,NULL可以釋放,但是不能連續釋放和釋放非法地址
ptr:要釋放的堆內存的首地址
注意:釋放的只是使用權,不會專門去清理全部的數據void *calloc(size_t nmemb,size_t size)
功能:從堆內存中申請nmemb塊大小為size字節的內存,申請到的內容塊會被初始化為0
注意:申請到的依然是一塊連續的內存void *realloc(void *ptr,size_t size)
功能:改變已有的內存的大小,在原來內存大小的基礎上調大或調小
ptr:想要改變大小的內存的首地址
size:表示調整后的大小
返回值:是調整后的內存塊的首地址,一定要重新接收返回值,因為可能不是在原來內存塊的基礎上調整的。如果無法在原來的基礎上進行調整:1、申請一塊新的符合大小要求的內存塊2、把原內存塊中的數據拷貝到新內存塊中3、把新內存塊的首地址返回

malloc內存管理機制:

當首次使用malloc申請內存時,malloc會向操作系統申請內存,操作系統會直接給malloc分配33頁(1頁=4096字節)內存交給malloc管理。
但是不意味著你可以越界訪問,因為malloc可能會把使用權分配給“其他人”,這就會導致臟數據。每個內存塊之間都會有一些空隙(4~12個字節),這些空隙一些是為了內存數據對齊,其中一定會有4個字節是用于記錄malloc維護信息,
這些維護信息決定了malloc下次分配內存的位置,以及借助這個維護信息計算出每個內存塊的大小,當這些信息被破壞時,會影響下一次和freemalloc函數的調用

使用堆內存要注意的問題:

內存泄露:內存無法再次使用,也無法被釋放,而再次使用時只能重新申請,然后重復以上操作,最后導致日積月累后系統中可以使用的內存越來越少注意:程序一旦結束后,屬于該程序的所有資源都會被操作系統回收如何盡量避免內存泄漏:誰申請誰釋放,誰知道該釋放誰釋放如何判斷定位內存泄漏:1、查看內存使用情況windows下看任務管理器,Linux下使用ps -aux命令查看內存使用情況)2、使用代碼分析工具來檢查malloc和free的調用情況3、包裝malloc和free函數,記錄申請釋放內存信息到日志中

內存碎片:

已經釋放但也無法繼續使用的內存叫做內存碎片,是由于申請和釋放的時間不協調導致的,是無法避免只能盡量減少如何減少內存碎片:1、盡量使用棧內存2、不要頻繁的申請和釋放內存3、盡量申請大塊內存自己管理s

內存清理函數:

#include<strings.h>
void bzero(void *s,size_t n);
功能:把內存塊按字節設置為0
s:內存塊的首地址
n: 要清理的內存塊的字節數#include<string.h>
void *memset(void *s,int c,size_t n);
功能:把內存塊按字節設置為字符c
s:內存塊的首地址
c:xiangyao設置的字符的ASCII碼值
n: 要清理的內存塊的字節數
返回值:返回設置成功后內存塊的首地址

堆內存定義二維數組:

指針數組:定義n*m的二維數組類型* arr[n];for(int i=0;i<n;i++){arr[i] = malloc(sizeof(類型)*m);}注意:每一行m值可以不同,所以可以定義不規則的二維數組數組指針:定義m*n的二維數組類型(*arrp)[n] = malloc(sizeof(類型)*n*m);注意:所謂的多維數組都是用一維數組來模擬的

練習1:計算出100~10000之間的所有素數,結果要存儲再堆內存中,不能浪費內存

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>bool is_ss(int n)
{for(int i=2;i<=sqrt(n);i++){if(n%i==0)return false;}return true;
}int main(int argc,const char* argv[])
{int* p=NULL;int cnt=0;for(int i=100;i<=10000;i++){if(is_ss(i)){p = realloc(p,(cnt+1)*sizeof(int));p[cnt++] = i;}}for(int i=0;i<cnt;i++){printf("%d ",p[i]);}free(p);p=NULL;return 0;
}

字符串

字符:在計算機中,字符是以整數形式存儲再內存中,當需要顯示為字符時,會根據ASCII碼表中的對應關系來顯示出相應的符號與圖案。'\0'    0'0'     48'A'     65'a'     97字符的輸入:scanf("%c",&ch);ch = getchar();字符的輸出:printf("%c",ch);putchar(ch);
串:是一種數據結構,是由一組連續的若干個相同類型的數據組成,末尾有一個結束標志。對于這種數據結構的處理都是批量性的,從開頭位置開始直到結束標志為止。字符串:由字符組成的串型結構,結束標志是'\0'字符串的輸入:scanf  %s   地址注意: 不能接受空格char *gets(char *s);功能:輸入字符串,并可以接收空格返回值:鏈式調用(把一個函數的返回值當作另一個函數的參數)char *fgets(char *s,int size,FILE *stream);功能:可以設置輸入的字符串的長度為size-1,超出部分不接受,會為'\0'預留位置。注意:如果輸入的字符數不足size-1個,,最后的'\n'會一起接受char str[20]={};fgets(str,20,stdin);字符串的輸出:printf  %s int puts(const char *s);功能:輸出一個字符串,會在末尾自動添加一個\n返回成功輸出的字符個數

字符串的存在形式:

字符數組: char str[10] = 由char類型組成的數組,要為'\0'預留位置使用的是棧內存,所以數據可以修改
字符串字面值:“Hello World!”"由雙引號包含的若干個字符",會在末尾隱藏一個\0字符串字面值是以地址形式存在的,數據是存儲再代碼段,如果修改則會產生段錯誤const char* p = “字符串字面值”;sizeof("strstr");結果 = 字符個數+兩個一摸一樣的字符串字面值在代碼段中只存儲一份常用方式: 字符數組[]="字符串字面值";會自動為'\0'預留位置注意:在賦值完成后字符串就存在了兩份,一份存儲在代碼段,一份存儲在棧內存(可修改)

練習2:實現一個函數,判斷字符串是否是回文數

#include<stdio.h>
#include<string.h>
#include<stdbool.h>bool is_hw(const char* n)
{int i,j;size_t len = strlen(n)-1;for(i=0;i<len/2;i++){if(n[i] != n[len-i])return false;}return true;
}int main(int argc,const char* argv[])
{char num[255]={};gets(num);if(is_hw(num))printf("yes");else printf("no");
}

練習3:實現一個函數,把由數字字符組成的字符串轉換為整數

#include<stdio.h>
#include<string.h>
void to_num(char* n,int l)
{for(int i=0;i<=l;i++){n[i] -= '0';}
}int main(int argc,const char* argv[])
{char num[10]={};gets(num);int len =strlen(num)-1;to_num(num,len);for(int i=0;i<=len;i++){printf("%d ",num[i]);}
}

練習4:實現一個函數,把字符串逆序、

#include<stdio.h>
#include<string.h>void change(char* n,int l)
{int i,j;for(i=0,j=l;j>i;i++,j--){char temp=n[j];n[j]=n[i];n[i]=temp;}
}int main(int argc,const char* argv[])
{char str[100]={};gets(str);int len=strlen(str)-1;change(str,len);puts(str);
}

練習5:實現一個抽獎函數,10人名單,按隨即順序列出人名

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>int main(int argc,const char* argv[])
{srand(time(NULL));char* name[10]={"張三","李四","王五","趙六","劉七","周八","srh","baba","erzi","yeye"};for(int i=0;i<10;){int index = rand()%10;if(NULL != name[index]){printf("第%d名:%s\n",i+1,name[index]);name[index]=NULL;i++;}}}

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

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

相關文章

學習筆記13-C語言-字符串函數、緩沖區

字符串的常用函數: #include<string.h> size_t strlen(const char* s); 功能&#xff1a;計算字符串長度&#xff0c;但是結果不包括\0 返回值&#xff1a;返回字符串中字符的個數size_t str_len(const char* str) {assert(NULL ! str);const char* tmp str;while(*tmp…

Oracle數據庫里面查詢字符串類型的字段不為空和為空的SQL語句:

摘要&#xff1a;近期項目中&#xff0c;在做高級查詢的時候有個條件是根據選擇的字段&#xff0c;然后再選擇字段的值為空和不為空做查詢&#xff0c;在寫SQL語句的時候費了很長時間&#xff0c;現在記錄一下&#xff0c;方便日后查看&#xff1a; 一&#xff1a;查詢字符串類…

學習筆記14-C語言-小項目-通訊錄

通訊錄&#xff1a; 要求&#xff1a; 姓名&#xff0c;性別、電話&#xff0c;最多儲存50個聯系人 功能&#xff1a;1、添加聯系人2、按名字刪除聯系人3、按姓名修改聯系人信息4、查找聯系人&#xff0c;可通過電話&#xff0c;名字查找&#xff0c;支持模糊查找5、顯示所有聯…

學習筆記15-C語言-預處理指令、條件編譯、頭文件

預處理指令&#xff1a; 程序猿編寫的代碼不是標準C代碼&#xff0c;并不能被真正的編譯器索編譯&#xff0c;需要一段程序把代碼翻譯一下。 翻譯的過程叫做預處理&#xff0c;被翻譯的代碼叫做預處理指令&#xff0c;以#開頭的都是預處理指令查看預處理的過程&#xff1a;gcc…

學習筆記16-C語言-小項目-使用Makefile完成2048

Makefile: Makefile是一系列編譯指令組成的可執行文本&#xff0c;也叫做編譯腳本。 在終端執行make命令會自動執行Makefile腳本中的編譯命令&#xff0c; 而且它還可以根據文件的最后修改時間來判斷哪些文件是否需要重新編譯、哪些文件不需要重新編譯&#xff0c;從而大大提高…

學習筆記17-C語言-結構、聯合、枚舉

結構&#xff1a; struct 結構是由程序猿自己設計的一種數據類型&#xff0c;用于描述一個事務的各項數據&#xff0c;由若干個不同的基礎數據類型組成。設計結構&#xff1a;struct 結構體名{類型 成員名&#xff1b;...}&#xff1b;定義結構體變量struct 結構體名 變量名&a…

Maven 3.0.5 安裝和配置:

摘要&#xff1a;現在的Web項目越來越多的都用maven管理了&#xff0c;所以我也抽時間學習學習&#xff0c;為了趕上時代&#xff01; 一&#xff1a;首先到maven官網&#xff1a;http://maven.apache.org/&#xff0c;然后選擇相應的版本下載&#xff0c;我這里下載的是maven…

學習筆記18-C語言-文件

文件的分類&#xff1a; 文本文件&#xff1a; 存儲的是ASCII碼值的二進制 二進制文件&#xff1a; 存儲的是數據的補碼文件IO&#xff1a; FILE *fopen(const char *path, const char *mode); 功能&#xff1a;打開或者創建文件 path&#xff1a;文件的路徑 mode&#x…

使用INNER JOIN ON 多表關聯查詢,獲取指定用戶下指定權限的資源SQL:

摘要&#xff1a;最近在看一個開源框架&#xff0c;其中用戶&#xff0c;角色&#xff0c;資源&#xff0c;這塊我感覺比較重要&#xff0c;所以就自己也模仿著寫了下&#xff0c;其中在獲取指定用戶下的權限資源的時候遇到問題了&#xff0c;開始時&#xff0c;我首先想到的方…

Maven學習記錄之maven基本操作命令,maven本地工廠的創建,maven骨架的生成,以及在eclipse中創建maven工程:...

摘要&#xff1a;今天又學習了一下maven&#xff0c;之前是下載并安裝和配置好了maven的環境&#xff0c;今天主要學習的內容包括&#xff1a;maven本地工廠的創建&#xff0c;maven骨架的生成命令&#xff0c;maven在dos下創建maven工程&#xff0c;以及在eclipse中創建mavne工…

Oracle中通過游標執行帶參數的存儲過程實現解析CLOB字段內的xml字符串:

摘要&#xff1a;近來之前的項目數據出現了問題&#xff0c;原因是由于之前在設計數據庫的時候把時間字段設置成了字符串格式&#xff0c;所以給后期的數據操作帶來了很大的麻煩&#xff0c;這里提醒一下各位程序猿&#xff0c;以后在開發項目的時候時間字段一定要是時間字段&a…

Eclipse中使用Checkstyle,checkstyle插件檢查java代碼的自定義配置文件:

摘要&#xff1a;近來項目組在搞代碼檢查&#xff0c;所以領導讓把checkstyle這個插件搞明白&#xff0c;現在我把我們寫的自定義的checkstyle.xml文件記錄一下&#xff0c;以便大家可以一起使用&#xff1a; 一&#xff1a;要使用checkstyle插件在eclipse中檢查java代碼&…

Linux 下安裝 jdk-7u75-linux-x64.gz,jdk1.7.0_75,jdk1.7步驟:

摘要&#xff1a;近來又用到了Linux系統&#xff0c;所以就又新裝了一個虛擬機和CentOS 6.4來用&#xff0c;搞開發的程序猿們可能都知道&#xff0c;在現在的很多企業中&#xff0c;生產環境大多都是Linux服務器&#xff0c;并且用的比較多的大都是CentOS&#xff0c;Red hat系…

Win7+VMware10.0+CentOS 6.4+Tomcat,Win7訪問不了CentOS6.4上的Tomcat

摘要&#xff1a;今天在linux下安裝Tomcat后&#xff0c;在虛擬機本地通過:http://localhost:8080/可以訪問安裝好的Tomcat服務器&#xff0c;但是在本機就不能訪問&#xff0c;前提是在本機下可以ping的通虛擬機的IP地址的&#xff0c;最后經過Google&#xff0c;發現說可能是…

Linux下配置OpenLDAP服務記錄

摘要&#xff1a;最近部門需要整合所有的系統&#xff0c;所以領導說要通過OpenLdap數據庫來實現對所有系統的統一管理&#xff0c;所以需要在服務器上配置一下LDAP服務&#xff0c;我們這里選擇的是OpenLdap服務&#xff0c;我在網上搜索了很多&#xff0c;開始都沒有配置成功…

Linux下配置CollabNet Subversion Edge

摘要&#xff1a;最近一直都在搞一下管理員的工作&#xff0c;今天又搞了svn的管理工具CollabNetSubversionEdge&#xff0c;網上也有很多例子&#xff0c;但是很多都是可以訪問到web界面&#xff0c;但是不能啟動版本庫的服務&#xff0c;所以我經過多次嘗試&#xff0c;終于解…

養成讓自己進步的10個習慣

養成讓自己進步的10個習慣 1.永遠不說不可能。"辦法總比問題多" 2.凡事第一反應找方法&#xff0c;不是找借口。"不要推卸責任" 3.養成記錄習慣&#xff0c;不太依賴腦袋。"好記性不如爛筆頭" 4.每天出門照鏡子&#xff0c;給自己自信的微笑。&…

Oracle存儲過程中使用游標來批量解析CLOB字段里面的xml字符串:

摘要&#xff1a;之前在項目中使用到了Oracle數據庫中通過觸發器去調用存儲過程執行數據解析并Update到對應的數據表中&#xff0c;但是&#xff0c;經過一段時間的測試使用發現&#xff0c;如果job那天停掉了&#xff0c;然后你再重新新建job的話&#xff0c;這時候可能會有很…

Maven配置nexus

摘要&#xff1a;近來一直在搭建maven結構的開發框架&#xff0c;其中這個過程中用到了nexus私服&#xff0c;這里我把我經過查詢總結的最終的方式記錄一下&#xff0c;以便后面忘記了&#xff1a; 一&#xff1a;nexus私服的安裝(略) 二&#xff1a;倉庫的講解如下圖: 1、ho…

Maven項目發布的配置

摘要&#xff1a;要想發布maven結構的項目到nexus私服上&#xff0c;可以通過兩種方式來&#xff0c;一種是在項目的pom.xml文件里面配置&#xff0c;另一種是通過命令的方式發布到nexus私服上&#xff0c;但是這種方式的前提也得在settings.xml文件配置用戶: 一&#xff1a;M…