C語言 動態內存分配機制(堆區) int*p=malloc(5*sizeof(4))

C程序內存分配圖

棧區:局部變量
堆區:動態分配的數據
靜態存儲區/全局區:全局變量,靜態數據
代碼區:代碼,指令
在這里插入圖片描述

內存分配說明

在這里插入圖片描述

內存動態分配的相關函數

堆區:
#inlcude<stdlib.h>

Malloc(size);//分配長度為size個字節的連續空間

Calloc(n,size);//分配size個長度為n個字節的連續空間,總共有size*n個字節

Free§;//銷毀指針p所指向的堆空間,其他函數和主函數不能再使用

Realloc(p,size);//重新分配指針p所指向的內存空間大小,指針所指向的地址不變,僅僅是空間擴大或縮小
在這里插入圖片描述
在這里插入圖片描述

Void*:

Void*:僅僅是一個純地址,而不指向任何的對象:
Void* p;//無類型指針變量
如果是void類型,不能夠用p來取得值(報錯)
在這里插入圖片描述
void*強制類型轉換舉例:
在這里插入圖片描述

代碼

#include<stdio.h>
//動態內存分配(堆區)--void*無類型指針int main()
{int a=102;int *pa=&a;//類型轉換1char b='c';char *pb=&b;void *p;char *pc;char *pd;p=(void*)pb;//強制類型轉換,char*pb-->void*,并把pb地址賦值給ppc=(char*)p;//強制類型轉換,void*p-->char*pd=(char*)pa;//記住:沒有*p,p只是一個地址,不指向任何對象printf("類型轉換1:\n");printf("pb=%c address=%p self-address=%p\n",*pb,pb,&pb);printf("p:address=%p self-address=%p\n",p,&p);printf("pc=%c address=%p self-address=%p\n",*pc,pc,&pc);printf("pd=%c address=%p self-address=%p\n",*pd,pd,&pd);getchar();return 0;
}

說明:
在C99的編譯器中,其他類型轉void*類型,是自動類型轉換:
int a=2;
void *p=&a;
低版本的則需要強制類型轉換:
void *p=(void *)&a;

應用案例

在這里插入圖片描述

代碼

#include<stdio.h>
#include<stdlib.h>
//動態內存分配(堆區)--malloc()函數
//輸出所有成績中小于60的成績
#define SIZE 5
void check(int *p,int len);//函數原型,函數聲明
int *check1(int *p,int len);int main()
{int *p=(int*)malloc(5*sizeof(int));//開辟5*4大小的空間,相當于一個長度為8的數組int i=0;//*p=-842150451是一個垃圾值,堆區的第一個字節,4個字節才存儲一個元素,因此不能使用*pprintf("address=%p self-address=%p\n",*p,p,&p);printf("輸入每一個成績:\n");while(i<5){//p+i=arr[0]+i的地址//通過數組的地址來為數組每一個元素賦值scanf("%d",p+i);i++;}printf("方式1:\n");//輸出成績1check(p,5);//輸出成績2int*k=check1(p,5);printf("\n方式2:\n");for(i=0;i<5;i++){if(*k!=0){printf("%d",*k);k++;}}getchar();//entergetchar();return 0;
}
void check(int *p,int len)
{int i;for(i=0;i<len;i++){if(p[i]<60){printf("%d ",p[i]);}}}int *check1(int *p,int len)
{static int i,j=0,arr[SIZE];//局部數據,使用靜態staticfor(i=0;i<len;i++){if(p[i]<60){arr[j++]=p[i];}}return arr;
}

圖示
在這里插入圖片描述

練習–逆序輸出字符串

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//動態內存分配(堆區)--函數練習
//malloc()分配內存空間
//realloc()重新分配內存空間
//free()釋放內存空間char *reverse(char *s,int len);//函數聲明
//逆序打印字符串
const int size=100;
int main()
{char *p=(char*)malloc(size*sizeof(char));//為p動態分配內存空間char s[size];gets(s);int len=strlen(s);char *p=(char*)realloc(p,len*sizeof(char));//重新為p分配更合適的內存空間//p=k[0]的地址(char*)p=reverse(s,len);int i;for(i=0;i<len;i++){printf("%c",*p+i);//或p++}free(p);//釋放p所指向的內存空間getchar();//entergetchar();return 0;
}
//逆序字符串
char *reverse(char *s,int len)
{int i=len-1,j=0;static char k[size];while(i>=0){k[j++]=s[i];i--;}return k;
}

基本原則

1)每開辟一個內存就會占用系統開銷,所以需要避免分配大量小內存塊
2)內存泄漏:沒有釋放內存空間,這一個內存空間就會一直被占用
3)開辟了動態內存后一定要記得釋放:誰分配,誰釋放
在這里插入圖片描述

指針使用一覽

指針數組:
由n個指向整型元素的指針而組成,里面存放指針
Int *ptr[3];

數組指針:
指向一個有n個元素的數組的指針,里面存放的是整型變量(int類型長度為n的數組的首地址),存的是一個數組地址,而不是單個元素
int(*p)[n]

int (*p)(int ,int):指向函數的指針

在這里插入圖片描述

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

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

相關文章

C++ primer 第15章 面向對象程序設計

文章目錄前言OOP&#xff1a;概述繼承動態綁定定義基類和派生類定義基類成員函數與繼承訪問控制與繼承定義派生類派生類中的虛函數派生類對象及派生類向基類的類型轉換派生類構造函數派生類使用基類的成員繼承與靜態成員派生類的聲明被用作基類的類防止繼承的發生類型轉換與繼承…

服務器密碼機部分文件的介紹學習

相關文件包 automake,autoconf使用詳解

C語言 結構體 struct Cat cat1;

引入 使用傳統技術解決 需要定義多個變量或數組 結構體與結構體變量的關系示意圖 類似Java類中的對象(結構體)與屬性(結構體變量) 一切物體都可以看作對象(結構體) 補充:C語言數據類型 簡單使用案例 代碼 Cat是我們自己定義的數據類型 struct Cat cat1;//創建struct Cat的…

boost Filesystem Library Version 3關于文件的一些函數封裝 fsync()函數

boost boost Filesystem Library Version 3boost::filesystem使用方法,根據路徑創建文件夾使用boost.filesystem檢查文件是否存在的正確方式std::filesystem::temp_directory_path關于C#:與boost :: filesystem :: unique_path()等效的C 17是什么?C++ 檔案、資料夾、路徑處理…

c++面向對象高級編程 總目錄

本文是對學習侯捷視頻 c面向對象高級編程系列博客的目錄總索引。 c面向對象高級編程 學習一 不帶指針的類&#xff1a; 訪問私有成員變量的方式&#xff0c;內聯inline&#xff0c;常量成員函數&#xff0c;構造函數&#xff0c;值傳遞&#xff0c;引用傳遞&#xff0c;操作符…

C語言 共用體/聯合體 union

引入 傳統技術的缺陷—結構體 共用體基本介紹 共用體與結構體一樣都是值傳遞 定義共用體的三種方式 內存布局 共用體數據空間占用最大的成員的數據空間大小 案例解析 1) 2) 3) 4) 注: 1010 1101 0101 0100所對應的十進制是負數 計算機中的二進制都是以補碼存儲的,所…

C++ Makefile文件詳解

什么是Makefile文件 一個工程&#xff0c;源文件不計其數&#xff0c;按照類型、功能、模塊分別放在對應的若干個目錄中Makefile定義了一系列的規則&#xff0c;比如定義文件編譯的先后順序。類似shell腳本&#xff0c;也可以執行操作系統的命令Makefile帶來的好處是自動化編譯…

C語言 項目練習-家庭收支軟件

目標 需求說明 界面說明 登記收入界面: 登記支出界面 收支明細界面 退出界面 項目代碼改進要求 自己完成的代碼 版本1 #include<stdio.h> #include<string.h> void choose(int button,int i); //項目--家庭收支軟件 static double total10000;//總金額 #de…

c++ fmt 庫安裝和使用示例、clion配置

安裝 git clone https://github.com/fmtlib/fmt.gitmake .mkae && make install CLion使用 使用和安裝存在出入下載源碼&#xff0c;可以先 clone 到你的項目中去&#xff0c;https://github.com/fmtlib/fmt &#xff0c;我放到的是項目的 dependencies 目錄然后在…

C語言 項目 CRM系統(客戶信息管理系統)

項目目標 項目需求說明 系統界面 1)添加客戶界面 通過編號來區分客戶 2)刪除客戶界面 對用戶輸入的編號進行核查,存在與否,合法與否 3)顯示客戶列表界面 4)修改客戶信息的界面 項目設計 Customer結構體的設計 CRM系統結構框架圖 案例代碼 #include <stdio.h>…

代碼重構 防火墻 相關知識

參考 依據Linux命令以及sysconf下現有的iptables命令&#xff0c;詳見hsm_sysconf_server/src/sysconf_server.cpp中的firewall規則。 接口名稱 firewall_manager 目的(現實) 根據網口直連獲取當前eth0和eth1的各種信息保證設置的正確性 以及要針對管理口和服務口設計不…

C語言 文件的基本介紹

基本介紹 輸入流與輸出流 重點在C程序(內存)的數據移動方向 對于C程序(內存) 輸入數據:輸入流 輸出數據:輸出流 輸入 和輸出 C標準庫 標準輸入輸出庫 標準文件 getchar()&putchar()函數 代碼 #include<stdio.h> #include<stdlib.h> //文件--getchar()和…

ubuntu修改字體 樣式

使用 快捷鍵 ctrlaltt 打開終端安裝gnome-tweaks桌面管理工具 sudo apt install gnome-tweaksaltf2 在運行窗口輸入 gnome-tweaks 命令&#xff0c;然后回車打開優化窗口&#xff0c;選擇第二個front字體選項ubuntu顯示中文

C語言 文件的讀寫

引入 OS操作系統 打開文件fopen()函數 讀寫模式: r:讀取已有文件 w:文件不存在,創建文件并寫入文件.文件存在,內容清零,再寫入文件 a: 文件不存在,創建文件并寫入文件.文件存在,以追加的形式寫入文件 r:讀寫已有文件 w:文件不存在,創建文件并讀寫文件.文件存在,內容清零,再…

StarWind V2V Image Converter:虛擬機鏡像轉換工具,可將 IMG 文件轉換為 VMware VMDK 文件

操作流程 選擇本地的需要轉換的文件找到源文件的路徑&#xff0c;img格式選擇轉化后的格式 第一個選擇 第二個 速度快一些選擇將轉化后的文件的存儲路徑軟件的下載鏈接 鏈接: https://pan.baidu.com/s/1Fe6yI42Zz9d_Q7aUhGe1FQ 提取碼: 5vmv

數學建模基礎知識

原型與模型 模型的分類 數學建模 數學建模的分類 成為建模大神 數學建模比賽 數學建模一般步驟 數學建模全過程 數學建模論文寫作 1&#xff09;摘要:是決定最后獲獎等級的關鍵 2&#xff09;問題重述:使用自己的語言將問題重述一次 3&#xff09;符號說明:對于常見的或…

數學建模 線性規劃模型基本原理

線性規劃問題 例1.1 可行解&可行域 matlab標準形式及軟件求解 標準形式: C稱為價值向量 如果是求max,加一個負號-c^T 如果是求Ax>b,加一個負號-Ax<b 使用matlab求線性規劃例題 求解的是最大值:加上負號 y是求解的最優解 zeros()使用: zeros(n)&#xff1a;生…

接上文 ,解決 虛擬機VM,U盤(磁盤)裝有系統,將其中系統安裝到另外一塊磁盤的具體操作

問題原因&#xff1a;接上文&#xff0c;將生成的vsdk格式的磁盤導入VM創建鏡像&#xff0c;相關于U盤裝載系統鏡像&#xff0c;將U盤其中的鏡像導入到磁盤里邊&#xff0c;U盤是引導&#xff0c;會將系統最終裝載到磁盤出錯原因是因為 沒有新建第二塊磁盤 解決 新增一塊磁盤如…

數學建模 層次分析法

簡介 針對多目標,多準則或無結構特性的復雜決策問題 步驟 解決評價類問題 評價類問題: 資料查找: 1)查找相關文獻 2)如果沒有找到相關文獻 3)搜索 通過上述步驟后得到的結果 構建層次結構模型 舉例: 成對比較矩陣 標度表: 奇數:越大越重要 偶數:上述兩相鄰判斷的中值…