65,144
社区成员
发帖
与我相关
我的任务
分享
#include "stdlib.h"
#include "stdio.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
char s[] = "这搞得我头疼";
char t[3];
t[0]=s[0];
t[1]=s[1]; // ‘这’ char类型
t[2]='\0'; // 字符串结束
cout<<s<<" "<<sizeof(char)<<" "<<sizeof(s)<<" "<<strlen(s)<<" "<<t<<endl;
wchar_t ws[7];// 随便设置,数组大小只有7喔
wchar_t wt[13]; // 定义一个实际需要的 以双字节显示数组s的数组
char *p = s;
int i;
for(i = 0; *p; ++i) // 在*p没有走到数组s最后,循环不会停,也就是说i=13才退出循环
{
int len = mbtowc(&ws[i], p, MB_CUR_MAX); // 于是ws越界了,定义只定义了长度7
p += len;
}
ws[i] = L'\0 ';
// 我们把数据复制到另外一个数组,就可以清晰的看到确实单字节变双字节了。
wt[0] = ws[0];
wt[1] = ws[1]; // 这 wchar_t类型
wt[2] = ws[2];
wt[3] = ws[3]; // 搞
wt[4] = ws[4];
wt[5] = ws[5]; // 的
wt[6] = ws[6];
wt[7] = ws[7]; // 我
wt[8] = ws[8];
wt[9] = ws[9]; // 头
wt[10] = ws[10];
wt[11] = ws[11]; // 疼
wt[12] = L'\0';
wcout<<ws<<" "<<sizeof(wchar_t)<<" "<<sizeof(ws)<<" "<<wcslen(ws) <<" "<<wt<<endl;
getchar();
return 0;
}
这搞得我头疼 1 13 12 这 // 1 char占一个字节; 13 数组s的长度是13字节; 12 字符串长度是12
这搞得我头疼 2 14 12 这搞得我头疼 // 2 wchar_t占2个字节; 14 数组sw的长度是14字节;12 字符串的长度是12
现象:越界数组ws[7]和wt[13]显示的相同。编译器不会对数组越界报错。
结论:编译器不会对char类型数组做越界的检查,需要作者自己注意。我想这也是为什么C/C++被人称为灵活,但稍有不慎会出现内存溢出。
这是我的想法,我是个C++初学者,大家有什么想法,请跟帖。
wchar_t ws[1];//这个到底分配了多少空间啊,2个字节32位,可为什么能显示6个汉字啊
wchar_t ws[15];//内存要分配够长
#include "stdlib.h"
#include "stdio.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
char s[15] = "这搞得我头疼";
cout<<s<<" "<<sizeof(char)<<" "<<strlen(s)<<endl;
wchar_t ws[15];//内存要分配够长
char *p = s;
int i;
for(i = 0; *p; ++i)
{
int len = mbtowc(&ws[i], p, MB_CUR_MAX);
p += len;
}
//delete []p;
ws[i] = L'\0 ';
wcout<<ws<<" "<<sizeof(wchar_t)<<" "<<wcslen(ws)<<endl;
getchar();
return 0;
}