猿问

如下,请问为什么strlen(buffer)会比10大?

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的内存空间吗?

慕妹3242003
浏览 154回答 2
2回答

炎炎设计

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阳

1。char *buffer = new char[10];加入buffer[9] = '\0';因为strnlen是以\0结束判断长度的2。他并不是在内存里转换类型,而是按照结构A中成员的偏移量访问该内存空间。
随时随地看视频慕课网APP
我要回答