struct A{int a;};void main(){char *buffer = new char[10];A *p = (A *)buffer;cout<<strlen(buffer)<<endl;int k = 4;p->a = k;cout<<p->a<<endl;system("pause");}1.请问为什么strlen(buffer)会比10大?2.A *p = (A *)buffer;这个表达式在内存里面是怎么转换类型的?是将buffer那块空间按照结构体A来分配两个结构体A的内存空间吗?
2 回答
炎炎设计
TA贡献1808条经验 获得超4个赞
1.你虽然开辟了10字节的空间,但是此时用strlen是不合适的,因为strlen是统计内容长度的(非空间大小),你此时对该空间并未初始化,所以strlen得到的值是不可预料的,一般应开辟空间后,再加一句,memset(buffer,0,10),既就是将空间全部初始化为0,以图后用。如果用sizeof来统计内容长度,即可得到预料的结果,但由于buffer是指针,用sizeif(buffer)得到的值即为4,因为指针只需要指向一块内存的地址即可。
2.C语言规定,任何指针类型均可转换,因为指针既就是内存的地址而已,所以A* p=(A*)buffer,由于sizeof(struct A)=4,而buffer指向的内存空间有10字节,所以表明该内存空间存在剩余,即没有完全利用,只用了其4字节,后6字节还没有使用。
BIG阳
TA贡献1859条经验 获得超6个赞
1。
char *buffer = new char[10];
加入
buffer[9] = '\0';
因为strnlen是以\0结束判断长度的
2。
他并不是在内存里转换类型,而是按照结构A中成员的偏移量访问该内存空间。
- 2 回答
- 0 关注
- 153 浏览
添加回答
举报
0/150
提交
取消