请教一个联合体的问题和sizeof的问题?
1.sizeof问题:
- C/C++ code
char *p="12345"; sizeof(p) 结果为4, char p[]="12345"; sizeof(p) 结果为6
请问下上面p不都是地址吗?sizeof是如何区分是指针还是数组?
2.请教一个联合体的问题:
- C/C++ code
union tag_u{ int b; int i; float f; struct { unsigned short len; char buf[1]; } s; char n[1]; struct { int len; int cap; //fzobj **items; } a; struct { char sorted; int len; int cap; //struct keyval *items; } d; struct { int num; int gen; //struct pdf_xref_s *xref; } r;} ;我的代码:
- C/C++ code
char *p="1235678098534909773409298340089230498"; tag_u *pu=(tag_u *)new char[sizeof(tag_u)+strlen(p)]; pu->s.len=strlen(p); memcpy(pu->s.buf,p,3); pu->s.buf[3]='\0'; cout<<pu->s.buf; //这里打印的是123,因为联合体长度限制只能打印123,请问如何打印出完整数据
请问我如何把一个超过buf的字符串放到buf中,并打印出来?
[解决办法]
我只知道sizeof指针和数组的问题:
首先,要知道指针变量:当定义一个指针变量的时候,不管这个指针变量保存的是何种类型的数据,请永远记住,指针永远是无符号长整型的,不管是何种指针,因为指针变量保存的是一个地址,永远是地址。而无符号长整型在32位机上是4字节,所以sizeof()一个指针永远是4.
对于:char p[]="12345";sizeof(p);来说,此处的p不能就直接说是指针,而是数组名,它代表的是这个数组的首地址,而对于这个C风格字符串,它是以‘\0’作为结束标志的,所以一共是6个字节。
[解决办法]
因为cout输出的时候碰到[\0]会结束的,所以你只能打出123。
[解决办法]
第一题,sizeof(p),p是指针,32位机,指针就是4字节。sizeof(静态数组),值就是静态数组的大小。
[解决办法]
如果你需要打出查过buf的字符串,需要在字符串中加上‘\0’结束符,而且调用memcpy的时候,需要传递整个buf的长度。。 你这样做很不安全。会覆盖buf后面的数据。。
[解决办法]
char p[]="12345";
sizeof(p) 结果为6
这个当中p是数组名,代表整个数组
char *p="12345";
sizeof(p) 结果为4,
这个p是"12345"的地址,"12345"返回一个指针