在使用字符串的时候经常需要计算字符串的长度,使用不正确的字符串大小会导致缓冲区溢出。字符串使用的是字符数组来实现,所有我们需要区分几个重要的属性,大小(size),计数(count),长度(length)。
大小(size)
分配给数组的字节数(等于sizeof(array))
计数(count)
在数组中元素的个数(等于_countof(array)
长度(length)
在空终结符之前的字符数
把这些概念弄混淆会导致程序中出现严重的错误。char 类型的字符串,一个字符数组的大小等于char 数组的计数,长度是空字符前的字符数,值小于或等于大小减去一。
char a[]= "123456789";
//size
cout << sizeof(a) << endl;
//count
cout<< _countof(a)<<endl;
//length
cout << strlen(a) << endl;
size =10,count=10,length =9
当宽字符串被认为是窄字符串或多字节字符串时,可能会不正确的计算字符串大小。
wchar_t a[]= L"123456789";
//size
cout << sizeof(a) << endl;
//count
cout<< _countof(a)<<endl;
//length
cout << wcslen(a) << endl;
size =20,count =10,length=9
看下面这段代码的错误,分配的内存没有考虑一个字符的宽度sizeof(wchar_t)
wchar_t a[]= L"123456789";
wchar_t* str = (wchar_t*)malloc(wcslen(a) + 1);
if (str != nullptr)
{
str = a;
}
std::wcout << str << std::endl;
free(str);
str = nullptr;
修改后的代码如下:
wchar_t* str = (wchar_t*)malloc((wcslen(a) + 1)*sizeof(wchar_t));