win32 – wsprintfW的使用

文档:将格式化的数据写入指定的缓冲区。根据格式字符串中相应的格式说明,将转换任何参数并将其复制到输出缓冲区。该函数在其写入的字符后附加一个终止空字符,但返回值的字符计数中不包含终止空字符。

例子:

#include <Windows.h>
#include <stdio.h>

int main()
{
    wchar_t str[2];
    unsigned int inter = 1;

    wsprintfW(str, L"%d", inter);
    wprintf(L"%s", str);

    return 0;
}

输出:1 

memory 分析:

win32 - wsprintfW的使用

win32 - wsprintfW的使用

可以看到宽字符占到两个字节,而wsprintfW会在字符后面自动添加'', 也是占到两个字节。

而上面的例子的目的是将无符号整型转换为字符串。也就是将1作为ch拷贝到str内,再添加''结束符,从而生成一个完整的字符串。

不过wsprintf不会报越界错误,比如下面的例子,

int main()
{
    wchar_t str[2];
    unsigned int inter = 12345678;

    wsprintfW(str, L"%d", inter);

    wprintf(L"%s", str);

    return 0;
}

可以看到inter的值为12345678,而str的大小只是两个宽字符(4个字节), 所以str的值为,

win32 - wsprintfW的使用

我们发现数组越界了,但是编译器并不会报错。

并且使用wprintf打印str时,会发现能够完整的打印出12345678。这是因为进程分配的内存都是按页分的,所以基本上str中的值都还在本进程的访问范围内。但是这是未定义的行为,'2'后面的字符(‘3’,‘4’...)容易被其他程序所申请的内存所修改了。

比如我们连续申请多个数组,会发现地址可能是连续的,那么第一个数组越界的值就可能被后面的数组的值所覆盖了。

 

原文链接: https://www.cnblogs.com/strive-sun/p/13755831.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    win32 - wsprintfW的使用

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404823

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:44
下一篇 2023年4月25日 下午4:45

相关推荐