c++ - 为什么 char 不是单个字符?
问题描述
在 Microsoft 的DEV_BROADCAST_DEVICEINTERFACE_A文档中,类型dbcc_name
定义如下:
char dbcc_name[1];
但正如这个 StackOverflow 问题所示,它原来是一个string
有多个字符的。
不是16 位值char
的单个字符吗?这是如何运作的?
(我原本以为char
是 16 位。大概是因为那是它在 c# 中的大小。实际上可能是因为我正在查看DEV_BROADCAST_DEVICEINTERFACE_W,它确实是 2 个字节。)
解决方案
不是
char
16位的值吗?
在什么平台上?在大多数平台(包括所有运行 Windows、AFAIK)上,char
是 8 位。
这是如何运作的?
类型文档解释了这一点:
dbcc_size
此结构的大小,以字节为单位。这是成员的大小加上 dbcc_name 字符串的实际长度(空字符由将 dbcc_name 声明为单字符数组来说明。)
换句话说, 的定义_DEV_BROADCAST_DEVICEINTERFACE_A
利用了数组衰减为 C++ 中的指针这一事实,因此dbcc_name
具有数组类型的 可以在大多数情况下用作以零结尾的字符串。实际的字符串与_DEV_BROADCAST_DEVICEINTERFACE_A
对象连续存储,地址从dbcc_name
.
值得注意的是,数组 (1) 的大小与其内容的长度无关;它只是 C++ 中最小的合法静态数组大小(遗留代码偶尔使用 struct 类型的成员char[0]
。但是,这是编译器扩展而不是合法的 C++)。
推荐阅读
- unity3d - Agora SDK 在 Windows Build 中不工作。VideoSurface.cs 在更新中总是得到 tmpi = -1
- c# - 在 C# 调试器中自动查找索引器,就像在 VB 中一样
- excel - 删除字符串中的点,数字 < 1000 的问题
- php - 表单验证的自定义请求
- php - 如何使用 Jmeter 绕过服务器中为每个请求定义的时间间隔
- mongodb - 如何通过避免 mongodb 聚合中的空值来查找 $lookup
- python - pip 或 pip3 install 命令抛出错误
- javascript - 带有顶部、底部和溢出的侧边导航
- java - Android Studio 2字节UTF-8序列的无效字节2
- python - 使用 Counter vs int vs lambda 创建 defaultdict