指針及數組內存變化詳解1

int _tmain(int argc, _TCHAR* argv[])
{
char in;
puts("hello world\n");
printf("%d%d\n",sizeof(int),sizeof(char*));
int intarray[5];
intarray[3]=1049215;
intarray[4]=1;
printf("%d\n",intarray[3]);
printf("%c#%1i#%1i#%1i#%1i?%2i?%2i\n",*((char*)(&intarray[3])),*((char*)(&intarray[3])),*((char*)(&intarray[3])+1),*((char*)(&intarray[3])+2),*((char*)(&intarray[3])+3),((short*)((char*)(&intarray[3])+1))[0],((short*)((char*)(&intarray[3])+1))[1]);
gets(&in);
return 0;

}


一個數組,int類型,長度爲5. 

&intarray[3]  取地址 -> 第四個元素的起始地址, int爲4個字節

(char*)(&intarray[3])  強制類型轉換爲char  char長度爲1

(char*)(&intarray[3])+1    偏移1個


內存狀態

intarray[0] : byte[0]/byte[1]/byte[2]/byte[3]  均爲0 .

intarray[1] : byte[0]/byte[1]/byte[2]/byte[3]  均爲0 .、

intarray[2] : byte[0]/byte[1]/byte[2]/byte[3]  均爲0 .

intarray[3]=2(20) + 2(9) +127 = 1049215

intarray[3] : byte[0]=127/byte[1]=2/byte[2=16]/byte[3] =0.

intarray[4]=1

intarray[4] : byte[0]=1/byte[1]=0/byte[2]=0/byte[3]=0


&intarray[3]  取地址 -> 第四個元素的起始地址, int爲4個字節,  此時指針指向byte(0)

(char*)(&intarray[3])    強制類型轉換爲char  char長度爲1   此時指針指向byte(0)

(char*)(&intarray[3])+1    偏移1個      此時指針指向byte(1)

((short*)((char*)(&intarray[3])+1))[0]    強制類型轉換爲short  short長度爲2   此時指針指向byte(1)byte(2)   = 4098 =2+ 2(12)

((short*)((char*)(&intarray[3])+1))[1]    強制類型轉換爲short  short長度爲2   此時指針指向byte(3)以及intarray[4]的byte(0)  = 256 = 0 + 2(8)



strdup 和strcpy 

strdup會自動分配內存其實是malloc 和strcpy的集合。

但是在某些C++庫中,strdup使用new來分配內存,所以如果在使用strdup中,會產生困惑,究竟是用free/還是delete來釋放strdup中申請的內存,如果free來釋放new的內存,則會產生不可理解的錯誤


strcpy 則是要調用者自行分配內存

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章