C语言内核深度理解
calloc
void *calloc( size_t num, size_t size );
在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長(zhǎng)度為size的連續(xù)空間,函數(shù)返回一個(gè)指向分配起始地址的指針;如果分配不成功,返回NULL。
與malloc的區(qū)別:
calloc在動(dòng)態(tài)分配完內(nèi)存后,自動(dòng)初始化該內(nèi)存空間為零,而malloc不初始化,里邊數(shù)據(jù)是隨機(jī)的垃圾數(shù)據(jù)。
malloc?
void *malloc( size_t size );
?函數(shù)指向一個(gè)塊連續(xù)的指定大小為size的空間,如果錯(cuò)誤發(fā)生返回NULL。 存儲(chǔ)空間的指針必須為堆,不能是棧。這樣以便以后用free函數(shù)釋放空間。
realloc?
? void *realloc( void *ptr, size_t size );
功能: 函數(shù)將ptr 對(duì)象的儲(chǔ)存空間改變?yōu)榻o定的大小size。 參數(shù)size可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空間的指針,如果錯(cuò)誤發(fā)生返回NULL
1.realloc失敗的時(shí)候,返回NULL
2. realloc失敗的時(shí)候,原來(lái)的內(nèi)存不改變,不會(huì)釋放也不會(huì)移動(dòng)
3. 假如原來(lái)的內(nèi)存后面還有足夠多剩余內(nèi)存的話(huà),realloc的內(nèi)存=原來(lái)的內(nèi)存+剩余內(nèi)存,realloc還是返回原來(lái)內(nèi)存的地址; 假如原來(lái)的內(nèi)存后面沒(méi)有足夠多剩余內(nèi)存的話(huà),realloc將申請(qǐng)新的內(nèi)存,然后把原來(lái)的內(nèi)存數(shù)據(jù)拷貝到新內(nèi)存里,原來(lái)的內(nèi)存將被free掉,realloc返回新內(nèi)存的地址
4. 如果size為0,效果等同于free()。這里需要注意的是只對(duì)指針本身進(jìn)行釋放,例如對(duì)二維指針**a,對(duì)a調(diào)用realloc時(shí)只會(huì)釋放一維,使用時(shí)謹(jǐn)防內(nèi)存泄露。
5. 傳遞給realloc的指針必須是先前通過(guò)malloc(), calloc(), 或realloc()分配的
6.傳遞給realloc的指針可以為空,等同于malloc。
返回情況:
返回的是一個(gè)void類(lèi)型的指針:調(diào)用成功。(這就要求在你需要的時(shí)候進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換)
返回NULL:當(dāng)需要擴(kuò)展的大小(第二個(gè)參數(shù))為0并且第一個(gè)參數(shù)不為NULL時(shí)。此時(shí)原內(nèi)存變成“free(游離)”的了。
返回NULL:當(dāng)沒(méi)有足夠的空間可供擴(kuò)展的時(shí)候。此時(shí),原內(nèi)存空間的大小維持不變。
?
free(ptr)
函數(shù)釋放指針ptr指向的空間,以供以后使用。指針ptr 必須由先前對(duì)malloc(), calloc(), realloc()的調(diào)用返回。
java種虛擬機(jī)對(duì)內(nèi)存的分配 : https://blog.csdn.net/chenpuzhen/article/details/80849199
野指針出現(xiàn)有三種情況:
1、使用指針前,忘了給指針變量初始化或賦值為一個(gè)有效的地址
2、不清楚某些地址空間的訪(fǎng)問(wèn)權(quán)限,但是指針試圖指向這些空間,并且按照不允許的權(quán)限去操作
3、訪(fǎng)問(wèn)空間,內(nèi)存越界。
三級(jí)指針寫(xiě)了個(gè)例子
? ? int a=10;
? ? int *p=&a;
? ? int **p1=&p;
? ? int ***b=&p1;
? ? printf("%d %d %d %d %d\n",*p,p,*p1,b,&b);
int const *p;
const int *p;
int const * const p;
改變const變量
int const a=10;
int *p=(int *) &a;
*p=100;
const 變量是通過(guò)編譯器檢查實(shí)現(xiàn)的,程序運(yùn)行的過(guò)程種不關(guān)系變量是否是const,只要保證編譯不出錯(cuò),在運(yùn)行的過(guò)程種去修改就可以
【但是結(jié)果并沒(méi)有改變,地址確實(shí)也是指向a的地址不過(guò)還不知道為什么】【ps老師說(shuō)是編譯器不同的原因】
sizeof(buf)=sizeof(buf[0])
sizeof(buf)/sizeof(int)
buf數(shù)組不能buf++;
指針本身強(qiáng)制轉(zhuǎn)換:
int a=10;
int *pa=&a;
float *pb=NULL;
pb=(float *)pa;
cout<<*pb<<' '<<a<<' '<<*pa<<endl<<&a<<' '<<pa<<' '<<pb;
將指針變量pa存放的地址轉(zhuǎn)換為(float *)后,賦給了pb,pb里面的地址與pa里面的地址是相等的,但是pa放的是(int *),pb放的是(float *),
雖然都指向一個(gè)地址空間a,但是使用*pb去使用變量a的時(shí)候,會(huì)以float型的空間大小和數(shù)據(jù)結(jié)構(gòu)使用a空間的值。【結(jié)果不等于a】
reverse()
是list容器下的一個(gè)方法,用重載對(duì)string char int等一般數(shù)據(jù)類(lèi)型都可以實(shí)現(xiàn)反轉(zhuǎn),
reverse(a.begin(),a.end())
reverse(a.begin()+len1,a.begin()+len2)
reverse(a.begin(),a.end(),array_b)
復(fù)雜度是O(n)
?
總結(jié)
- 上一篇: HPC System Design
- 下一篇: 最长连续子序列变种