请求分页内存管理的模拟 c++代码_C开发实战-内存管理
作用域和變量
作用域就是作用的范圍,當(dāng)定義變量時(shí)不同作用域的變量位于不同的內(nèi)存空間。
變量按照不同的作用域可以分為局部變量和全局變量。而局部變量和全局變量都可以使用static修飾,static修飾的局部變量叫靜態(tài)局部變量,static修飾的全局變量叫靜態(tài)全局變量。當(dāng)定義一個(gè)變量時(shí),除了要考慮初始化賦值以外,還要注意變量的作用域和生命周期。
局部變量
局部變量定義在{}內(nèi),其作用域在{}內(nèi)部有效,出了{(lán)}變量就無法使用。
局部變量如果沒有初始化賦值,系統(tǒng)會(huì)給局部變量隨機(jī)賦垃圾數(shù)值。
生命周期表示變量從開辟內(nèi)存空間(生)、釋放內(nèi)存空間(死)的過程。
通常局部變量的生命周期在定義時(shí)開辟內(nèi)存空間,在所在的函數(shù)執(zhí)行結(jié)束后釋放內(nèi)存空間
#define _CRT_SECURE_NO_WARNINGS#include #include /*在自定義方法中定義和使用局部變量*/void print_local_variable_value() {printf("execute print_local_vairbale_value() method ");//局部變量 ,作用域在定義時(shí){}之內(nèi)int age = 29;//靜態(tài)局部變量static double dbl = 3.14;printf("局部變量 age =%d", age);printf("靜態(tài)局部變量 dbl =%lf", dbl);//定義局部變量時(shí)開辟內(nèi)存空間,函數(shù)結(jié)束之后釋放內(nèi)存空間int number = 10;int* p = NULL;if (number) {//局部變量在函數(shù)結(jié)束之后釋放空間int data = 20;p = &data;printf("number = %d ", number);}//超過了data的作用域,無法訪問data變量//data = 100;//通過指針獲取局部變量的值printf("*p=%d ", *p);//通過指針修改局部變量的值*p = 30;printf("*p=%d ", *p);}/*局部變量定義和使用注意事項(xiàng)@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){printf("execute main method ");//無法在main()函數(shù)中使用print_local_variable_value()方法定義的局部變量//printf("局部變量 age =%d",age);//printf("靜態(tài)局部變量 dbl =%lf",dbl);print_local_variable_value();system("pause");return 0;}程序運(yùn)行結(jié)果
在使用局部變量時(shí)不應(yīng)該將局部變量的地址用作函數(shù)的返回值,否則會(huì)引發(fā)程序異常。
#define _CRT_SECURE_NO_WARNINGS#include #include #include /*自定義方法返回定義的局部變量地址*/int* return_local_variable_address() {int x = 100;Sleep(5000);//返回局部變量x的地址return &x;}/*局部變量的返回值問題@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){int* p = return_local_variable_address();printf("return_local_variable_address()方法的返回值是%d", *p);*p = 800; // p所指向的空間已經(jīng)被釋放,不能操作這塊內(nèi)存printf("*p = %d", *p);system("pause");return 0;}形參的本質(zhì)就是局部變量,基本類型作為形參時(shí)不能返回形參的地址,而指針類型的形參可以作為返回值
#define _CRT_SECURE_NO_WARNINGS#include #include /*形參的本質(zhì)就是局部變量*/int* change_value(int data) {data += 100;return &data; //不可以返回形參的地址}int* change_pointer(int *p) {int i = 10;*p = *p + i;return p; //返回地址 }/*返回指針的地址@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){int value = 200; change_value(value);int* p=change_pointer(&value);system("pause");return 0;}靜態(tài)局部變量
靜態(tài)局部變量是使用static修飾的局部變量,如果在定義靜態(tài)局部變量時(shí)沒有賦值,如果變量類型是整數(shù)類型默認(rèn)初始化值為0,其作用域和局部變量一樣,也是在其定義的{}之內(nèi)有效。
靜態(tài)局部變量在main函數(shù)運(yùn)行之前就已經(jīng)開辟空間,而且靜態(tài)全局變量只會(huì)有唯一一份內(nèi)存空間,在程序結(jié)束之后釋放內(nèi)存空間。
當(dāng)在main函數(shù)中多次調(diào)用print_static_local_variable_value()方法修改靜態(tài)全局變量時(shí)不會(huì)再為靜態(tài)局部變量number開辟內(nèi)存空間,即static int number=1;在整個(gè)程序的生命周期只會(huì)執(zhí)行一次。
程序運(yùn)行結(jié)果
由于靜態(tài)據(jù)變量的聲明周期是在程序退出時(shí)才會(huì)釋放內(nèi)存空間,因此靜態(tài)局部變量可以作為函數(shù)的返回值。
#define _CRT_SECURE_NO_WARNINGS#include #include /*自定義方法返回定義的局部變量地址*/int* return_static_local_variable_address() {static int x = 100;printf("x = %d",x);//返回靜態(tài)局部變量x的地址return &x;}/* 靜態(tài)局部變量作為函數(shù)的返回值@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){int* p = return_static_local_variable_address();printf("return_static_local_variable_address()方法的返回值是%d", *p);//修改變量x的值*p = 800;printf("*p = %d", *p);return_static_local_variable_address();system("pause");return 0;}程序運(yùn)行結(jié)果
全局變量
全局變量即定義在函數(shù)外部的變量,如果全局變量類型是int,聲明全局變量時(shí)默認(rèn)初始化值為0。全局變量的生命周期是在main函數(shù)執(zhí)行之前開辟空間,在程序結(jié)束后釋放內(nèi)存空間。
由于全局變量在程序結(jié)束運(yùn)行時(shí)才會(huì)釋放內(nèi)存空間,因此在日常開發(fā)中盡量少用全局變量。
#define _CRT_SECURE_NO_WARNINGS#include #include //全局變量定義在函數(shù)外部,作用域在整個(gè)項(xiàng)目//執(zhí)行main函數(shù)之前開辟內(nèi)存空間,程序結(jié)束釋放內(nèi)存空間int x;void changex() {printf("execute changex()method");printf("初始化全局變量x = %d ",x);//在自定義函數(shù)修改全局變量的值x = 20;printf("修改全局變量x之后x = %d ", x);}/*全局變量的定義和使用@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){printf("inside method()");//在不同的函數(shù)之間訪問全局變量xchangex();printf("main method x = %d ",x);system("pause");return 0;}全局變量的作用域在整個(gè)項(xiàng)目內(nèi)都可以訪問,例如在global_variable.c中定義了全局變量int x;在同一個(gè)項(xiàng)目的另外一個(gè)文件global_variable_acces.c中訪問。不過在使用之前需要使用extern關(guān)鍵字顯示聲明 extern int x;
#define _CRT_SECURE_NO_WARNINGS#include #include /*不同文件的全局變量的訪問@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*///顯示聲明整型變量x,即告知編譯器x在其他地方定義過,此處通過編譯extern int x;int main(int argc, char* argv[]){//修改全局變量x的值為100x = 100;printf("全局變量x = %d",x);system("pause");return 0;}程序運(yùn)行結(jié)果
靜態(tài)全局變量
靜態(tài)全局變量就是使用static修飾的全局變量,靜態(tài)全局變量的作用域在當(dāng)前文件有效,而不能像全局變量一樣跨文件使用。也不能使用extern關(guān)鍵字顯示聲明。
靜態(tài)全局變量的聲明周期也是在執(zhí)行main()函數(shù)之前開辟內(nèi)存空間,在程序結(jié)束時(shí)釋放內(nèi)存空間。靜態(tài)局部變量聲明時(shí)如果是int類型,那么初始化默認(rèn)值也是0。如果是double類型初始化默認(rèn)值為0.0;
程序運(yùn)行結(jié)果
靜態(tài)成員變量的注意事項(xiàng)
#define _CRT_SECURE_NO_WARNINGS#include #include // 不能使用extern顯示聲明靜態(tài)全局變量//extern double dbl;/*靜態(tài)全局變量的使用注意事項(xiàng)@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){// 不能跨文件使用靜態(tài)全局變量//dbl = 3.14;//printf("靜態(tài)全局變量dbl = %.2lf", dbl);system("pause");return 0;}作用域和變量最佳實(shí)踐
在多文件編程時(shí),通常將變量、函數(shù)的定義放在源文件中(例如這里的global_variable.c),將變量、函數(shù)的聲明放在和源文件同名的頭文件(例如這里的global_variable_access.h)中。
#pragma once#pragma once//顯示聲明整型變量x,即告知編譯器x在其他地方定義過,此處通過編譯extern int x;//顯示聲明函數(shù)extern void changex();然后在源文件global_variable_access.c中包含頭文件global_variable_access.h,就可以使用聲明的全局變量和函數(shù)
##define _CRT_SECURE_NO_WARNINGS#include #include #include "global_variable_access.h"/*不同文件的全局變量的訪問@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){//修改全局變量x的值為100x = 100;printf("全局變量x = %d",x);changex();system("pause");return 0;}程序運(yùn)行結(jié)果
不同作用域的變量名相同是可以共存的,但是需要注意的是相同作用域的變量名重名是不行滴。
在源文件diff_scope_static_global_variable.c中定義靜態(tài)全局變量并在方法中打印初始值
#include static int number = 10;void print_static_global_variable_number() {printf("static global variable number = %d",number);}在頭文件diff_scope_variable_duplication.h中顯示聲明print_static_global_variable_number()函數(shù)。
#pragma onceextern void print_static_global_variable_number();在源文件diff_scope_variale_duplication.c中定義和使用全局變量,局部變量
#define _CRT_SECURE_NO_WARNINGS#include #include #include "diff_scope_variable_duplication.h"//定義全局變量 初始化賦值為10int data = 10;int get_value() {int data = 100;{int data = 200;}//此時(shí)打印輸出data =10 printf("get_value() method local variable data= %d",data);return data;} /*不同作用域的變量重名@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){print_static_global_variable_number();int value = get_value();printf("value = %d",value);printf("global variable data= %d",data);system("pause");return 0;}程序運(yùn)行結(jié)果
局部變量的地址不能作為方法的返回值,因?yàn)榫植孔兞康膬?nèi)存空間在所在的函數(shù)結(jié)束后就會(huì)被釋放,而靜態(tài)局部變量,全局變量和靜態(tài)全局變量的地址可以作為函數(shù)的返回值。因?yàn)槌绦蚪Y(jié)束之前靜態(tài)局部變量,全局變量,和靜態(tài)全局變量在程序結(jié)束之前內(nèi)存空間不會(huì)被釋放。
靜態(tài)函數(shù)
默認(rèn)定義的函數(shù)就是全局函數(shù),其作用域可以在整個(gè)工程中使用,如果是跨文件使用,在頭文件中使用extern顯示聲明即可,沒有局部函數(shù)。
而使用static修飾的函數(shù)是靜態(tài)函數(shù),其作用域是只能在當(dāng)前源文件中使用。
當(dāng)前文件中定義和使用靜態(tài)函數(shù)是ok的
#define _CRT_SECURE_NO_WARNINGS#include #include /*定義靜態(tài)函數(shù)*/static double get_dbl() {double dbl = 3.14;return dbl;}/*靜態(tài)函數(shù)的定義和使用@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){double dbl = get_dbl();printf("dbl = %.2lf",dbl);system("pause");return 0;}但是跨文件使用時(shí),系統(tǒng)會(huì)提示無法解析的外部符號(hào)_get_dbl
內(nèi)存的結(jié)構(gòu)
當(dāng)程序編譯、鏈接完成時(shí),編譯器已經(jīng)規(guī)劃好了內(nèi)存空間,拿出當(dāng)年寫的helloworld程序
#include int main(){ printf("Hello c with Windows10 1903 & Visual Studio Code & MinGW7.3.0 "); return 0;}在Windows上使用size helloworld.exe查看內(nèi)存,單位大小以字節(jié)(Byte)為單位
- text表示代碼區(qū)
- data表示數(shù)據(jù)區(qū),用于存放全局變量,
- bss表示未初始化的數(shù)據(jù)區(qū)
- dec表示 text+data+bss的大小
當(dāng)在helloworld源程序中定義一個(gè)全局變量時(shí),編譯器會(huì)重新規(guī)劃數(shù)據(jù)區(qū)的大小
#include int number=100; //定義全局變量,初始化賦值為100int main(){ printf("Hello c with Windows10 1903 & Visual Studio Code & MinGW7.3.0 "); return 0;}data
當(dāng)在helloworld源程序匯中聲明一個(gè)全局變量時(shí),未初始化數(shù)據(jù)區(qū)也會(huì)發(fā)生變化。
#include int number=100; //定義全局變量,初始化賦值為100int age;int main(){ printf("Hello c with Windows10 1903 & Visual Studio Code & MinGW7.3.0 "); return 0;}bss
而局部變量時(shí)在程序運(yùn)行時(shí)分配空間,內(nèi)存由棧區(qū)、堆區(qū)、靜態(tài)全局區(qū)、代碼區(qū)組成。
內(nèi)存結(jié)構(gòu)
定義不同類型的變量
- 未初始化的全局變量a,未初始化的靜態(tài)全局變量b,g位于未初始化的靜態(tài)全局區(qū)
- 初始化的全局變量c,初始化的靜態(tài)全局變量d,h位于已初始化的靜態(tài)全局區(qū)
- 未初始化的局部變量e,i和初始化的局部變量f,j位于棧區(qū)
獲取變量的地址時(shí),相同類型的存儲(chǔ)區(qū)域的地址編號(hào)是相近的
程序運(yùn)行結(jié)果
內(nèi)存處理函數(shù)
內(nèi)存清零函數(shù)memset()
memeset()函數(shù)用于將指定的內(nèi)存清零
#define _CRT_SECURE_NO_WARNINGS#include #include #include /*memset()函數(shù)的使用@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){int number = 10;//等價(jià)于 number = 0;memset(&number, 0, sizeof(number));printf("number = %d ",number);char buf[10]="";//清空bufmemset(buf, 0, sizeof(buf));for (int i = 0; i < sizeof(buf) / sizeof(buf[0]);i++) {printf("buf[%d]=%s ",i,buf[i]);}printf("將buf數(shù)組的前九個(gè)元素置為a");//將buf數(shù)組的前九個(gè)元素置為amemset(buf,'a',sizeof(buf)-sizeof(buf[0]));for (int i = 0; i < (sizeof(buf) / sizeof(buf[0]))-1; i++) {printf("buf[%d]=%c ", i, buf[i]);}system("pause");return 0;}程序運(yùn)行結(jié)果
內(nèi)存拷貝memcpy()函數(shù)
memcpy()函數(shù)實(shí)現(xiàn)整數(shù)數(shù)組指定大小的元素拷貝
#define _CRT_SECURE_NO_WARNINGS#include #include #include /*memcpy()函數(shù)拷貝整數(shù)數(shù)組@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){int source[10] = {1,2,3,4,5,6,7,8,9,10};int target[10] = {0};//將source數(shù)組的元素拷貝10個(gè)到targetmemcpy(target, source, sizeof(source));printf("遍歷拷貝之前source數(shù)組的元素");for (int i = 0; i < sizeof(source) / sizeof(source[0]); i++) {printf("target[%d] = %d ", i, source[i]);}printf("遍歷拷貝之后target數(shù)組的元素");for (int i = 0;i程序運(yùn)行結(jié)果
memcpy()函數(shù)實(shí)現(xiàn)指定字符串的拷貝,相比于strncpy()函數(shù),memcpy()函數(shù)在拷貝字符串時(shí)遇到了'0'也不會(huì)停止拷貝
#define _CRT_SECURE_NO_WARNINGS#include #include #include /*memcpy()函數(shù)拷貝字符數(shù)組memcpy()函數(shù)對(duì)比strncpy()函數(shù)@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){char str1[128] = "";char str2[128] = "hello0wo0rld";printf("使用memcpy()函數(shù)將str2數(shù)組的10個(gè)元素拷貝到str1數(shù)組中");memcpy(str1, str2, 10 * sizeof(char));printf("遍歷拷貝之后的str1數(shù)組的元素列表");for (int i = 0; i < 10;i++) {printf("%d",str1[i]);}printf("");//相對(duì)于strnpy()函數(shù),memcpy()遇到'0'不會(huì)停止拷貝printf("使用memset()函數(shù)將str1數(shù)組的元素清空");memset(str1, 0, sizeof(str1));printf("使用strncpy()函數(shù)將str2數(shù)組的10個(gè)元素拷貝到str1數(shù)組中");strncpy(str1, str2, 10);printf("遍歷拷貝之后的str1數(shù)組的元素列表");for (int i = 0; i < strlen(str1); i++) {printf("%d", str1[i]);}printf("");system("pause");return 0;}內(nèi)存比較memcmp()函數(shù)
memcmp函數(shù)用于實(shí)現(xiàn)內(nèi)存的比較,相較于strcmp()函數(shù)在遇到‘0’時(shí)不會(huì)停止比較
#define _CRT_SECURE_NO_WARNINGS#include #include #include /*內(nèi)存比較memcmp()函數(shù)@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){int source[10] = {1,2,3,4,5,6,7,8,9,10};int target[10] = {1,2,3,4,5,6,7,8,9,10};int result =memcmp(source, target, 10 * sizeof(int));printf("source和target兩個(gè)整數(shù)數(shù)組比較的結(jié)果是%d",result);//清空target數(shù)組的內(nèi)容memset(target, 0, sizeof(target));result = memcmp(source, target, 10 * sizeof(int));printf("清空target數(shù)組的內(nèi)容后source和target兩個(gè)整數(shù)數(shù)組比較的結(jié)果是%d", result);//memcmp函數(shù)和strncmp函數(shù)的比較char str1[128] = "hello0agian";char str2[128] = "hello0seeyouagain";//strcmp函數(shù)遇到0會(huì)結(jié)束比較printf("使用strcmp函數(shù)比較str1和str2大小的結(jié)果是%d",strcmp(str1,str2));//memcmp函數(shù)遇到0不會(huì)結(jié)束比較printf("使用memcmp函數(shù)比較str1和str2大小的結(jié)果是%d",memcmp(str1,str2,128*sizeof(char)));system("pause");return 0;}程序運(yùn)行結(jié)果
因此得出結(jié)論:內(nèi)存操作函數(shù)遇到0或者0都不會(huì)結(jié)束處理,而字符串處理函數(shù)遇到0結(jié)束處理。
堆內(nèi)存申請(qǐng)和釋放
當(dāng)處理的數(shù)據(jù)比較大,可以向堆申請(qǐng)空間,C語言提供了malloc()函數(shù)來申請(qǐng)堆內(nèi)存空間。
malloc()函數(shù)需要的參數(shù)是字節(jié)數(shù)量,返回類型為void *即萬能指針,如果申請(qǐng)的空間存放的數(shù)據(jù)是字符,void * 可以轉(zhuǎn)換為char *,如果申請(qǐng)的空間存放的是整數(shù),void *可以轉(zhuǎn)換為int *。
如果malloc()函數(shù)申請(qǐng)的堆內(nèi)存空間不再使用,可以使用free()函數(shù)來釋放堆內(nèi)存空間,不能釋放棧空間,需要注意的是只能申請(qǐng)一次,釋放一次,而且是同一內(nèi)存地址。如果釋放了多次會(huì)造成系統(tǒng)異常。
#define _CRT_SECURE_NO_WARNINGS#include #include #include /*堆內(nèi)存申請(qǐng)和釋放malloc()函數(shù):申請(qǐng)堆內(nèi)存空間,返回內(nèi)存首地址,返回類型為void *,參數(shù)為字節(jié)的數(shù)量@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){//申請(qǐng)4個(gè)字節(jié)的堆內(nèi)存空間,返回一個(gè)地址 void *// 需要將void *強(qiáng)制類型轉(zhuǎn)換為int* int * p=(int *)malloc(sizeof(int));//操作堆內(nèi)存*p = 100;printf("堆內(nèi)存:*p = %d",*p);// 申請(qǐng)一個(gè)數(shù)組,數(shù)組有10個(gè)元素,元素的類型為intint *p_array=(int*)malloc(sizeof(int[10]));//給第六個(gè)元素賦值為200*(p_array + 5) = 200; //給最后一個(gè)元素賦值100p_array[9] = 100;for (int i = 0; i < sizeof(int[10]) / sizeof(int);i++) {printf("*p_array[%d] = %d",i,*(p_array+i));}// 申請(qǐng)一個(gè)字符數(shù)組 存儲(chǔ)1024個(gè)元素char* p_char =(char*)malloc(1024);//空間清零memset(p_char, 0, 1024);// 空間釋放,malloc申請(qǐng)的空間只能釋放一次free(p_char);system("pause");return 0;}程序運(yùn)行結(jié)果
生產(chǎn)環(huán)境的都是7*24小時(shí)不間斷運(yùn)行,如果程序一直在申請(qǐng)內(nèi)存空間,而不釋放內(nèi)存空間,導(dǎo)致程序使用的內(nèi)存空間一直增長,就會(huì)造成內(nèi)存泄漏。程序退出后,程序使用的所有內(nèi)存才會(huì)釋放。日常開發(fā)中應(yīng)該盡量避免內(nèi)存泄漏,除此以外還有內(nèi)存污染的問題,即沒有申請(qǐng)空間,就往空間中寫數(shù)據(jù)。
堆內(nèi)存地址可以作為函數(shù)的返回值,因?yàn)槎褍?nèi)存在函數(shù)結(jié)束時(shí)不會(huì)被釋放空間,但是在操作堆內(nèi)存時(shí)需要注意一些問題
#define _CRT_SECURE_NO_WARNINGS#include #include char* malloc_heap() {//申請(qǐng)128個(gè)字節(jié)的堆內(nèi)存char* q = malloc(128);return q; //堆區(qū)的地址是可以返回,因?yàn)楹瘮?shù)結(jié)束不會(huì)釋放堆內(nèi)存}/*返回堆內(nèi)存的地址@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){char* p = malloc_heap();//將hello字符串拷貝到p指向的堆內(nèi)存空間strcpy(p, "hello");//釋放堆內(nèi)存free(p);/*********錯(cuò)誤的堆操作*********///此時(shí)p指向了文字常量區(qū)//p = "hello";//此時(shí)釋放的不是堆內(nèi)存//free(p);system("pause");return 0;}通過函數(shù)的值傳遞不能改變變量的值,即實(shí)參的值不會(huì)改變形參的值,但是傳遞實(shí)參的地址可以調(diào)用函數(shù)改變實(shí)參的值。
能不能返回地址,需要看地址指向的空間有沒有被釋放。
如果要解決該問題,將q的指針返回即可。
#define _CRT_SECURE_NO_WARNINGS#include #include #include char* malloc_q(char *q ) {// q指向堆內(nèi)存q = malloc(1024);return q;}/*實(shí)參作為一級(jí)指針地址@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){//實(shí)參是一級(jí)指針char* p = NULL;p=malloc_q(p);strcpy(p,"helloworld");printf("p = %s",p);system("pause");return 0;}程序運(yùn)行結(jié)果
另外一種解決方法
#define _CRT_SECURE_NO_WARNINGS#include #include #include char* malloc_q(char **q ) {// q指向堆內(nèi)存*q = malloc(1024);return q;}/*實(shí)參作為一級(jí)指針地址@author liuguanglei 18601767221@163.com@wechat 18601767221@website ittimeline.net@version 2020/11/27*/int main(int argc, char* argv[]){//實(shí)參是一級(jí)指針char* p = NULL;malloc_q(&p);//bug 因?yàn)閜指向NULL,無法實(shí)現(xiàn)字符串復(fù)制strcpy(p,"helloworld");printf("p = %s ",p);system("pause");return 0;}程序運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的请求分页内存管理的模拟 c++代码_C开发实战-内存管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python建立回归模型_简单线性回归的
- 下一篇: html表格数据循环展示,MVC在Vie