正确计算字符长度

在使用字符串的时候经常需要计算字符串的长度,使用不正确的字符串大小会导致缓冲区溢出。字符串使用的是字符数组来实现,所有我们需要区分几个重要的属性,大小(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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值