指针及数组内存变化详解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 则是要调用者自行分配内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值