目錄
創(chuàng)新互聯(lián)主營(yíng)瀘水網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件開發(fā),瀘水h5微信小程序定制開發(fā)搭建,瀘水網(wǎng)站營(yíng)銷推廣歡迎瀘水等地區(qū)企業(yè)咨詢🤩前言🤩:
一、動(dòng)態(tài)內(nèi)存概述??:
? 1.什么是動(dòng)態(tài)內(nèi)存:
? 2.動(dòng)態(tài)內(nèi)存分配的意義:
二、常用的動(dòng)態(tài)內(nèi)存函數(shù)🏹:
? 1. malloc 和 free函數(shù):
? ①. malloc 函數(shù):
? ②. free 函數(shù):
? ③. malloc 函數(shù)與 free 函數(shù)的使用:
? 2. calloc 函數(shù):
3. realloc 函數(shù):
三、常見動(dòng)態(tài)內(nèi)存錯(cuò)誤🛡?:
? 1.對(duì) NULL 指針的解引用操作:
? 2.對(duì)動(dòng)態(tài)內(nèi)存空間的越界訪問;
? 3.對(duì)非動(dòng)態(tài)內(nèi)存空間使用 free 函數(shù):
? 4.使用 free 函數(shù)釋放動(dòng)態(tài)內(nèi)存空間的一部分:
? 5.對(duì)同一塊動(dòng)態(tài)內(nèi)存空間多次釋放:
? 6.不釋放動(dòng)態(tài)內(nèi)存空間(內(nèi)存泄漏):
🥳總結(jié)🥳:
🛰?博客主頁(yè):??鑾同學(xué)的干貨分享基地
🛰?歡迎關(guān)注:👍點(diǎn)贊🙌收藏??留言
🛰?系列專欄:💐【進(jìn)階】C語(yǔ)言學(xué)習(xí)
🛰?代碼倉(cāng)庫(kù):🎉VS2022_C語(yǔ)言倉(cāng)庫(kù)
? 家人們更新不易,你們的👍點(diǎn)贊👍和👉關(guān)注👈真的對(duì)我真重要,各位路過的友友麻煩多多點(diǎn)贊關(guān)注,歡迎你們的私信提問,感謝你們的轉(zhuǎn)發(fā)!
?關(guān)注我,關(guān)注我,關(guān)注我,你們將會(huì)看到更多的優(yōu)質(zhì)內(nèi)容!!
🏡🏡本文重點(diǎn)🏡🏡:
🚅動(dòng)態(tài)內(nèi)存🚃動(dòng)態(tài)內(nèi)存函數(shù)🚃常見動(dòng)態(tài)內(nèi)存錯(cuò)誤🚏🚏
?
? C 語(yǔ)言是一門神奇、實(shí)用而又基礎(chǔ)的語(yǔ)言,我們幾乎可以說所有的編程語(yǔ)言,都是在 C 語(yǔ)言的基礎(chǔ)上發(fā)展而來的。許多小伙伴們學(xué)習(xí) C 語(yǔ)言的目的,都是為了繼續(xù)學(xué)習(xí)其它的高級(jí)語(yǔ)言,而我們學(xué)習(xí)各種語(yǔ)言的最終目的,一定是為了寫出更好的代碼和程序,尋找一份滿意的工作。
? 而今天這篇博客的內(nèi)容,就是關(guān)于如何通過開辟動(dòng)態(tài)內(nèi)存,從而寫出更加優(yōu)秀的程序的。同時(shí)今天的內(nèi)容對(duì)于以后想要繼續(xù)學(xué)習(xí) C++ 的同學(xué)們來說尤為重要,希望各位小伙伴們能夠認(rèn)真學(xué)習(xí)仔細(xì)思考,多多練習(xí)牢固掌握。
一、動(dòng)態(tài)內(nèi)存概述??:? 接下來我們就正式開始關(guān)于動(dòng)態(tài)內(nèi)存的學(xué)習(xí),首先我們先來大致了解一下動(dòng)態(tài)內(nèi)存。
? 1.什么是動(dòng)態(tài)內(nèi)存:在c/c++語(yǔ)言中,所謂動(dòng)態(tài)內(nèi)存分配,就是指在程序執(zhí)行的過程中動(dòng)態(tài)地分配或者回收存儲(chǔ)空間的分配內(nèi)存的方法。動(dòng)態(tài)內(nèi)存分配不像數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲(chǔ)空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。
? 2.動(dòng)態(tài)內(nèi)存分配的意義:? 我們?cè)谥暗膶W(xué)習(xí)過程中,在使用各種變量與數(shù)組等等功能時(shí),都需要從內(nèi)存中開辟出一片空間用于存放我們的數(shù)據(jù),而在之前我們掌握的內(nèi)存開辟方式有:
int value = 20;
//在內(nèi)存棧空間上開辟4個(gè)字節(jié)的空間
char arr[10] = { 0 };
//在棧空間上開辟10個(gè)字節(jié)的連續(xù)空間? 但是我們最經(jīng)常時(shí)使用的這兩種內(nèi)存空間的開辟方式有一些共同的特點(diǎn):
1. 空間開辟大小是固定的。
2. 數(shù)組在申明的時(shí)候必須指定數(shù)組的長(zhǎng)度,它所需要的內(nèi)存將會(huì)在編譯時(shí)分配。
? 換句話說,這兩種內(nèi)存開辟方式都是靜態(tài)內(nèi)存分配。
但是我們?cè)谌粘5拇a編寫和程序使用過程中,對(duì)于空間的需求往往不僅限于上述情況。更多的時(shí)候我們需要的空間大小只有在在程序運(yùn)行的時(shí)候才能知道。如此,數(shù)組等在編譯時(shí)開辟空間的方式無法滿足我們的實(shí)際運(yùn)行需求。
例如:
1. 通訊錄創(chuàng)建聯(lián)系人數(shù)據(jù) data[1000],實(shí)際有聯(lián)系人13個(gè),造成大量的空間浪費(fèi)。
2. 通訊錄創(chuàng)建聯(lián)系人數(shù)據(jù) data[20],后期共有聯(lián)系人113人,初期開辟的空間不夠用。
? 于是就需要使用一種更好的內(nèi)存分配方式進(jìn)行處理,動(dòng)態(tài)內(nèi)存分配應(yīng)運(yùn)而生。
二、常用的動(dòng)態(tài)內(nèi)存函數(shù)🏹: ? ? ? ? 1. malloc 和 free:? malloc 函數(shù)(memory allocate,即內(nèi)存分配)的作用為向內(nèi)存的堆區(qū)申請(qǐng)空間用于存儲(chǔ)數(shù)據(jù),free 函數(shù)的作用為釋放使用 malloc 函數(shù)向堆區(qū)申請(qǐng)的空間,并將空間歸還給內(nèi)存的堆區(qū)空間,通過配合使用這兩個(gè)函數(shù)可以從堆區(qū)申請(qǐng)(釋放)動(dòng)態(tài)內(nèi)存空間。
? ①. malloc 函數(shù):? 我們首先來看 malloc 函數(shù):

? 我們可以看到,malloc? 函數(shù)的使用格式為:
void* malloc (size_t size);
? 從它的使用格式中我們可以看出,該函數(shù)向堆區(qū)申請(qǐng)了一塊連續(xù)的空間,同時(shí)返回的是這塊空間的指針。
? ②. free 函數(shù):★ 如果開辟成功,則返回一個(gè)指向開辟好空間的指針。
★ 如果開辟失敗,則返回一個(gè) NULL 指針,故我們?cè)谑褂脮r(shí)一定要仔細(xì)檢查?malloc 函數(shù)的返回值。
★ 返回值的類型是 void* ,即 malloc 函數(shù)并不了解開辟空間的類型,至于空間的具體類型將在使用時(shí)由使用者自己決定。
★ 如果參數(shù) size 為 0,則 malloc 函數(shù)的行為是標(biāo)準(zhǔn)未定義的,將會(huì)取決于編譯器。
? 我們同樣先來看看我們的 free 函數(shù):

? 我們可以看到,free 函數(shù)的使用格式為:
void free (void* ptr);
? 不同的是,與 malloc?函數(shù)恰好相反,free函數(shù)的作用為釋放動(dòng)態(tài)開辟的內(nèi)存,同時(shí)沒有返回值:
? ③. malloc 函數(shù)與 free 函數(shù)的使用:★ 如果參數(shù) ptr 指向的空間不是動(dòng)態(tài)開辟的,那free函數(shù)的行為是未定義的。
★ 如果參數(shù) ptr 是NULL指針,則 free 函數(shù)將什么都不會(huì)做。
? 關(guān)于兩個(gè)函數(shù)的實(shí)際使用,我們直接來看下面這段?malloc 函數(shù)與 free 函數(shù)的使用實(shí)例:
#include#includeint main()
{
int* ptr = NULL;
//初始化指針
ptr = (int*)malloc(40);
//使用malloc函數(shù)動(dòng)態(tài)申請(qǐng)40字節(jié)空間
//同時(shí)因?yàn)橹羔榩tr類型為int*,而 malloc 函數(shù)的返回類型為void*,故使用強(qiáng)制類型轉(zhuǎn)換
int* p = ptr;
//在此定義指針p的原因是,在之后的使用中,指針p的指向會(huì)發(fā)生改變
//若不對(duì)初始指針指向進(jìn)行保存,將無法釋放改變前與改變后之間的空間
if (p == NULL)
//mallocc函數(shù)在動(dòng)態(tài)空間開辟失敗時(shí)返回空指針
//即若此處為空指針,說明動(dòng)態(tài)內(nèi)存空間申請(qǐng)失敗
{
perror("malloc");
//打印malloc函數(shù)動(dòng)態(tài)空間申請(qǐng)錯(cuò)誤原因,并結(jié)束程序
return 1;
}
//沒有結(jié)束說明指針不為空,動(dòng)態(tài)空間申請(qǐng)成功
int i = 0;
for (i = 0; i< 10; i++)
{
*p = i;
//循環(huán)向動(dòng)態(tài)內(nèi)存空間中存入數(shù)據(jù)
p++;
//在此處的操作中,指針p的指向發(fā)生了改變
}
//使用完成后釋放動(dòng)態(tài)內(nèi)存空間:
free(ptr);
//指針p指向發(fā)生改變,但指針ptr仍指向初始指針
ptr = NULL;
//動(dòng)態(tài)內(nèi)存空間歸還后,重新將指針ptr置空
//動(dòng)態(tài)內(nèi)存空間已經(jīng)歸還,若不將指針ptr進(jìn)行置空,指針ptr將變?yōu)橐爸羔槪赶驅(qū)⒉豢煽兀@在程序運(yùn)行中非常危險(xiǎn)
return 0;
} ? 具體的使用方法在注釋中已經(jīng)注明了,在這里我們要在對(duì)其中幾個(gè)地方再次進(jìn)行強(qiáng)調(diào):
? 2. calloc 函數(shù):1. 在對(duì)指針進(jìn)行操作前一定要保存指向初始位置的原始指針。
2. 在對(duì)指向動(dòng)態(tài)內(nèi)存空間的指針進(jìn)行使用前,一定要進(jìn)行非空判斷。
3. 在動(dòng)態(tài)內(nèi)存空間使用完畢并釋放后,一定要將指針進(jìn)行置空操作。
4. 當(dāng)程序結(jié)束時(shí)若動(dòng)態(tài)內(nèi)存空間沒有被釋放,將會(huì)被操作系統(tǒng)自動(dòng)回收。
5. 但若程序不結(jié)束且申請(qǐng)的動(dòng)態(tài)內(nèi)存空間持續(xù)不歸還,動(dòng)態(tài)內(nèi)存將不會(huì)被回收,就會(huì)導(dǎo)致內(nèi)存泄漏問題。
? 我們來看這個(gè)函數(shù):

? 可以看到,calloc 函數(shù)的使用格式為:
void* calloc (size_t num, size_t size);
? 更通俗的說,calloc 函數(shù)的功能就是,為 num 個(gè)大小為 size 的元素開辟一塊動(dòng)態(tài)內(nèi)存空間,并將空間內(nèi)每個(gè)字節(jié)都初始化為 0。
? 其使用方式與 malloc 函數(shù)無異:
#include#includeint main()
{
int* ptr = NULL;
ptr = (int*)calloc(10, sizeof(int));
//使用calloc函數(shù)動(dòng)態(tài)申請(qǐng)10個(gè)int類型大小的空間
//同時(shí)因?yàn)橹羔榩tr類型為int*,而calloc函數(shù)的返回類型為void*,故使用強(qiáng)制類型轉(zhuǎn)換
int* p = ptr;
if (p == NULL)
{
perror("calloc");
return 1;
}
int i = 0;
for (i = 0; i< 10; i++)
{
*p = i;
p++;
}
free(ptr);
ptr = NULL;
return 0;
} 并且實(shí)際作用相比較來說,與函數(shù) malloc 的區(qū)別僅在于 calloc 函數(shù)在返回地址前會(huì)把申請(qǐng)的空間內(nèi)每個(gè)字節(jié)都初始化為 0?,其它方面完全相同。
? 也就是說,如果我們需要將申請(qǐng)來的動(dòng)態(tài)內(nèi)存空間進(jìn)行初始化,那么我們就可以通過使用 calloc 函數(shù)來達(dá)到我們的目的。
3. realloc 函數(shù):? 我們來看 realloc 函數(shù):

? realloc 函數(shù)(re - allocate,即重新分配)的作用為重新分配從堆區(qū)申請(qǐng)來的動(dòng)態(tài)內(nèi)存空間的大小。其使用格式為:
void* realloc (void* ptr, size_t size);
? 前面 malloc 、free 與 calloc 三個(gè)函數(shù)的存在,都是為了向堆區(qū)申請(qǐng)或釋放動(dòng)態(tài)內(nèi)存空間,但是倘若只使用前三個(gè)函數(shù),我們可以發(fā)現(xiàn),申請(qǐng)來的內(nèi)存空間的看起來與靜態(tài)內(nèi)存空間似乎沒有什么太大的區(qū)別。
于是,recalloc 函數(shù)出現(xiàn)了。
? realloc 函數(shù)的出現(xiàn),使得動(dòng)態(tài)內(nèi)存管理更加的靈活。例如有些時(shí)侯我們覺得前面申請(qǐng)的空間太小了不夠用,或者我們會(huì)覺得申請(qǐng)的空間過大了太浪費(fèi),這個(gè)時(shí)候我們就可以通過使用?realloc 函數(shù)對(duì)之前開辟的動(dòng)態(tài)內(nèi)存空間的大小再次進(jìn)行合理的調(diào)整。
? 換句話說,正是 realloc 函數(shù)才使得動(dòng)態(tài)內(nèi)存空間真正變得“ 動(dòng)態(tài) ”起來。
? 例如我們可以直接修改上面的例子,當(dāng)我們?cè)谑褂眠^程中發(fā)現(xiàn)我們申請(qǐng)來的動(dòng)態(tài)內(nèi)存空間不夠用時(shí),我們就可以通過使用 realloc 函數(shù)來對(duì)我們申請(qǐng)來的動(dòng)態(tài)內(nèi)存空間進(jìn)行擴(kuò)容:
#include#includeint main()
{
int* ptr = NULL;
ptr = (int*)malloc(40);
int* p = ptr;
if (p == NULL)
{
perror("malloc");
return 1;
}
int i = 0;
for (i = 0; i< 10; i++)
{
*p = i;
p++;
}
realloc(ptr, 80);
//空間不夠用,重新分配更大的空間
//將指針ptr指向的空間擴(kuò)容至80字節(jié)
free(ptr);
PTR = NULL;
return 0;
} ? 但哪怕是在成功擴(kuò)容時(shí),也仍會(huì)出現(xiàn)兩種情況:當(dāng)前空間與后相鄰空間之間的空間是否足夠 realloc 函數(shù)進(jìn)行擴(kuò)容操作。
★ 若空間足夠,則直接執(zhí)行擴(kuò)容操作,并在擴(kuò)容完成后返回指向起始位置的指針。
★?若空間不夠,則將會(huì)在堆區(qū)中重新尋找合適的空間(足以容納下擴(kuò)容后的全部空間),并將原空間內(nèi)的數(shù)據(jù)全部拷貝過來,接著釋放原空間,并在擴(kuò)容完成后返回指向新空間起始位置的指針。
? 但是還有最特殊的情況,即內(nèi)存堆空間中沒有能夠容納整個(gè)擴(kuò)容后的動(dòng)態(tài)內(nèi)存空間的空間時(shí),將會(huì)返回空指針。所以,我們?cè)谙胍褂脭U(kuò)容后的動(dòng)態(tài)內(nèi)存空間時(shí),為了避免使用指針內(nèi)容為空指針而造成的意外錯(cuò)誤,在使用之前首先應(yīng)當(dāng)對(duì) realloc 函數(shù)返回的指針進(jìn)行非空判斷,之后再拿來使用:
#include#includeint main()
{
int* ptr = NULL;
ptr = (int*)malloc(40);
int* PTR = NULL;
PTR = (int*)realloc(ptr, 80);
int* p = NULL;
//空間不夠用,重新分配更大的空間
//將指針ptr指向的空間擴(kuò)容至80字節(jié)
if (PTR != NULL)
//使用前進(jìn)行非空判斷,避免出現(xiàn)無法預(yù)料的錯(cuò)誤
{
p = PTR;
}
//判斷非空,即擴(kuò)容成功,開始使用:
int i = 0;
for (i = 0; i< 20; i++)
{
*p = i;
p++;
}
free(PTR);
PTR = NULL;
return 0;
} 三、常見動(dòng)態(tài)內(nèi)存錯(cuò)誤🛡?:
? ? ? ? 1.對(duì) NULL 指針的解引用操作:int main()
{
int* p = (int*)malloc(INT_MAX);
//當(dāng)嘗試開辟的空間過大時(shí),將會(huì)導(dǎo)致動(dòng)態(tài)內(nèi)存開辟失敗
//此時(shí)malloc函數(shù)將會(huì)返回空指針,即此時(shí)指針p也是空指針
*p = 20;
//沒有判斷非空就對(duì)指針p進(jìn)行解引用操作,導(dǎo)致產(chǎn)生對(duì)空指針進(jìn)行了解引用操作
//將會(huì)造成內(nèi)存非法訪問的錯(cuò)誤
free(p);
p = NULL;
return 0;
}? 避免出現(xiàn)此類問題的方法是,在指針使用前對(duì) malloc 等函數(shù)的返回值進(jìn)行非空判斷。
? 2.對(duì)動(dòng)態(tài)內(nèi)存空間的越界訪問;int main()
{
int* p = (int*)malloc(10 * sizeof(int));
if (NULL == p)
{
perror("malloc");
return 1;
}
int i = 0;
for (i = 0; i<= 10; i++)
{
*(p + i) = i;
//當(dāng)i=0時(shí),將會(huì)出現(xiàn)越界訪問的錯(cuò)誤
}
free(p);
p = NULL;
return 0;
}? 避免此類錯(cuò)誤的方式是,在使用時(shí)仔細(xì)認(rèn)真的進(jìn)行內(nèi)存邊界的檢查,并選擇合適的空間訪問范圍。
? 3.對(duì)非動(dòng)態(tài)內(nèi)存空間使用 free 函數(shù):int main()
{
int a = 10;
//變量a所使用的內(nèi)存空間不是動(dòng)態(tài)內(nèi)存空間
int* p = &a;
free(p);
//釋放非動(dòng)態(tài)內(nèi)存空間
p = NULL;
return 0;
}? 避免此類錯(cuò)誤的方式是,在進(jìn)行空間釋放時(shí)注意區(qū)分靜態(tài)內(nèi)存空間與動(dòng)態(tài)內(nèi)存空間。
? 4.使用 free 函數(shù)釋放動(dòng)態(tài)內(nèi)存空間的一部分:int main()
{
int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
perror("malloc");
return 1;
}
int i = 0;
for (i = 0; i< 10; i++)
{
*p = i;
p++;
//此時(shí)指針p的指向已經(jīng)發(fā)生變化,不再指向起始位置
}
free(p);
//釋放部分動(dòng)態(tài)內(nèi)存空間
p = NULL;
return 0;
}? 避免此類錯(cuò)誤的方法是,在使用指針前保存好初始指向,并在進(jìn)行動(dòng)態(tài)內(nèi)存釋放時(shí)釋放完整的動(dòng)態(tài)內(nèi)存空間。
? 5.對(duì)同一塊動(dòng)態(tài)內(nèi)存空間多次釋放:int main()
{
int* p = (int*)malloc(10 * sizeof(int));
free(p);
//...(在中間又進(jìn)行了很多其它操作之后,忘記了已經(jīng)釋放過動(dòng)態(tài)內(nèi)存空間,并進(jìn)行了重復(fù)釋放)
free(p);
//重復(fù)釋放動(dòng)態(tài)內(nèi)存空間
p = NULL;
return 0;
}? 避免此類問題的方法是,在已經(jīng)釋放過動(dòng)態(tài)內(nèi)存空間之后,一定要加以注釋以提醒自己避免重復(fù)釋放同一塊動(dòng)態(tài)內(nèi)存空間。
? 6.不釋放動(dòng)態(tài)內(nèi)存空間(內(nèi)存泄漏):void test()
{
int* p = (int*)malloc(10 * sizeof(int));
if (p != NULL)
{
*p = 20;
//判斷非空后進(jìn)行使用
}
//使用后沒有釋放動(dòng)態(tài)內(nèi)存空間,在程序終止前該動(dòng)態(tài)內(nèi)存空間都將無法被釋放,將會(huì)逐漸蠶食計(jì)算機(jī)系統(tǒng)的內(nèi)存
}
int main()
{
test();
while (1);
//為了演示內(nèi)存泄漏,使程序永不終止
return 0;
}? 避免此類問題的方法是,永遠(yuǎn)記住,使用一個(gè)釋放一個(gè),使用結(jié)束立刻釋放。
🥳總結(jié)🥳:? 到這里我們今天關(guān)于動(dòng)態(tài)內(nèi)存管理的介紹與學(xué)習(xí)就結(jié)束啦,通過今天內(nèi)容的學(xué)習(xí),相信各位小伙伴們已經(jīng)掌握了動(dòng)態(tài)內(nèi)存的開辟、釋放與動(dòng)態(tài)修改,并且已經(jīng)對(duì)動(dòng)態(tài)內(nèi)存空間的各項(xiàng)使用注意事項(xiàng)有了一定的認(rèn)知和了解。希望小伙伴們?cè)谙氯ヒ院螅趯?duì)動(dòng)態(tài)內(nèi)存空間的使用和管理中一定要慎之又慎,盡大可能避免出現(xiàn)類似的相關(guān)問題。
🔥🔥只有承擔(dān)起旅途風(fēng)雨,才能最終守得住彩虹滿天!!!🔥🔥
更新不易,辛苦各位小伙伴們動(dòng)動(dòng)小手,👍三連走一走💕💕 ~ ~ ~? 你們真的對(duì)我很重要!最后,本文仍有許多不足之處,歡迎各位認(rèn)真讀完文章的小伙伴們隨時(shí)私信交流、批評(píng)指正!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前文章:【C語(yǔ)言進(jìn)階】想用好C++?那就一定要掌握動(dòng)態(tài)內(nèi)存管理-創(chuàng)新互聯(lián)
鏈接分享:http://chinadenli.net/article0/cohdoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、全網(wǎng)營(yíng)銷推廣、搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容