C语言中,对 sizeof() 的处理都是在编译阶段进行。

下面代码,注意可变参数是怎么使用的

#include<Windows.h>
#include<stdio.h> int MessageBoxPrint(char *szFormat, ...);
int fun(char ch[]); int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR strCmd, int nShow)
{
char str[];
MessageBoxPrint("%p", hInst);
MessageBoxPrint("ch=%d", fun(str));
return ;
} int MessageBoxPrint(char *szFormat, ...)
{
char buf[];
va_list va;
va_start(va, szFormat);
vsnprintf(buf, sizeof(buf), szFormat, va);
va_end(va);
return MessageBox(NULL,buf,"printf",MB_OK);
} int fun(char ch[])
{
return sizeof(ch);
}

sizeof在fun函数种计算的是指针ch的长度,32位OS下恒为4

sizeof计算字符串含要看在什么位置,写完代码时很难预估风险,最好使用strlen

修改如下

#include<Windows.h>
#include<stdio.h> int MessageBoxPrint(char *szFormat, ...);
int fun(char ch[]); int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR strCmd, int nShow)
{
char str[];
MessageBoxPrint("%p", hInst);
MessageBoxPrint("ch=%d", fun(str));
return ;
} int MessageBoxPrint(char *szFormat, ...)
{
char buf[];
va_list va;
va_start(va, szFormat);
vsnprintf(buf, sizeof(buf), szFormat, va);
va_end(va);
return MessageBox(NULL,buf,"printf",MB_OK);
} int fun(char ch[])
{
return strlen(ch);
}

这时还有个问题,由于WinMain里面str没有初始化,strlen计算长度的时候,长度是未知的。因为他要一直找到\0才结束,所以strlen的时候长度可能大于1024,可能等于1024,也可能小于1024。

strlen()求的是长度,针对的对象是字符串,而sizeof()求的是大小,针对的是类型,首先要明确的一个概念是,strlen()是函数,而sizeof()表面看起来是函数,其本质是关键字。

printf函数原型

extern int printf(const char *format,...);

vsnprintf()函数 & vfprintf()函数

vsnprintf函数
头文件:#include  <stdarg.h>
函数原型:int vsnprintf(char *str, size_t size, const char *format, va_list ap);
函数说明:将可变参数格式化输出到一个字符数组
参数:str输出到的数组,size指定大小,防止越界,format格式化参数,ap可变参数列表函数用法
 
vfprintf()函数
头文件:#include  <stdarg.h>
函数原型: int vfprintf(FILE *stream, const char *format, va_list arg);
函数说明:fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(‘\0’)为止。

02 WIndows编程——危险的sizeof的更多相关文章

  1. 【Windows编程】系列第六篇:创建Toolbar与Statusbar

    上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...

  2. 【Windows编程】系列第十一篇:多文档界面框架

    前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典 ...

  3. 【Windows编程】系列第八篇:通用对话框

    上一篇我们学习了菜单的基本编程,本篇来了解一下通用对话框的使用.Windows系统之所以是目前最流行的桌面系统,也是因为Windows有一套标准化,统一友好的交互界面,比如菜单.工具栏.状态栏以及各个 ...

  4. 【Windows编程】系列第九篇:剪贴板使用

    上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...

  5. 【转】浅析Windows编程的剪贴板

    摘要: 本文对Windows剪贴板机制作了深入.全面的阐述,具体内容包括:文本.位图.DSP.自定义格式剪贴板的使用和多数据项和延迟提交技术. 关键词: VC++6.0: 剪贴板机制:数据格式:延迟提 ...

  6. windows 编程—— 宽字符集 与 Unicode

    目录: 从ASCII码 到 Unicode Windows 编程中的 "字符” 定义 (如何在windows下进行通用编码) 常用的通用函数,定义 (本文为学习<Programming ...

  7. Windows编程之进程遍历(C++实现)

    Windows编程之进程遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历进程需要几个API,和一个结构体 1.创建进程快照 2.遍历首次进程 3.继续下次遍历 4.进程信息结构体 API 分 ...

  8. Windows编程之模块遍历(C++实现)

    Windows编程之模块遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历模块需要几个API,和一个结构体 1.创建进程快照 2.遍历首次模块 3.继续下次遍历 4.模块信息结构体 API 分 ...

  9. windows编程之内核对象

          学好windows编程,理解内核对象还是至关重要的(●'◡'●).闲话不多说,下面先来了解一下关于内核对象的知识:       内核对象(kernel object):内核对象是用于管理进 ...

随机推荐

  1. (五)AJAX技术

    一.定义 AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的 ...

  2. 转载:Spark中文指南(入门篇)-Spark编程模型(一)

    原文:https://www.cnblogs.com/miqi1992/p/5621268.html 前言 本章将对Spark做一个简单的介绍,更多教程请参考:Spark教程 本章知识点概括 Apac ...

  3. activiti的坑

    maven配置: <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-e ...

  4. Ubuntu下配置LVS【h】

    以后服务器只用CentOS和Ubuntu.下午用redhat装个lvs装了一下午都没搞好,TNND的.果断用Ubuntu,不到两个小时就搞定了. 原文参见: http://kamengwang.blo ...

  5. python+unittest框架第一天unittest之简单认识Test Fixure:测试固件【8月17更新】

    20万的慢慢会实现的吧,hhh unittest框架,我就不在介绍了,百度有很详细的介绍. 我们只要了解: 1.unittest是单元测试框架 2.它提供用例组织与执行:在实际工作中案例可能有上百条, ...

  6. Shuffle 机制

    1. 概述 Map 方法之后,Reduce 方法之前的数据处理过程称之为 Shuffle. 2. Partition 分区 需求:要求将统计结果按照条件输出到不同文件中(分区).比如:将统计结果按照手 ...

  7. win10安装docker运行环境

    转自:https://www.cnblogs.com/stulzq/p/7743667.html Docker for Windows是Docker社区版(CE)应用程序. Docker for Wi ...

  8. mysql-系统表的使用

    https://blog.csdn.net/wind520/article/details/38728655

  9. 【坑】使用IDEA创建maven的时候,提示缺少plugin-clean 等

    解决方法 检查你的网络,能否访问 maven 中央仓库 : 在 IDEA 中是否对 maven 进行了配置 IDEA 默认使用的 仓库 和 配置文件,都是 .m2 下面的: 如果你自己对 maven ...

  10. python Django基础操作

    Django常用命令 创建Django项目 Django-admin startprotect  mysite 创建项目以后,以下生成的文件 最外层的file:mysite/ 根目录只是你的项目的容器 ...