155 lines
14 KiB
HTML
155 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>sizeof 运算符</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_language_sizeof skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">sizeof 运算符</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="c.html">c</a>‎ | <a href="c-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>查询对象或类型的大小</p>
|
|
<p>在必须知道对象实际大小时使用</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>sizeof(</b></code> <span class="t-spar">类型</span> <code><b>)</b></code></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>sizeof</b></code> <span class="t-spar">表达式</span> <code></code></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>两个版本都返回 <span class="t-lc"><a href="c-types-size_t.html">size_t</a></span> 类型值。</p>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<div class="t-li1"><span class="t-li">1)</span> 返回 <span class="t-spar">类型</span> 的<a href="c-language-object.html#.E5.AF.B9.E8.B1.A1.E8.A1.A8.E7.A4.BA">对象表示</a>的字节大小。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 返回 <span class="t-spar">表达式</span> 类型的对象表示的字节大小。不应用隐式转换到 <span class="t-spar">表达式</span> 。</div>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E6.84.8F">注意</span></h3>
|
|
<p>取决于计算机架构,<a href="https://en.wikipedia.org/wiki/Byte" class="extiw" title="enwiki:Byte">字节</a>可能由 8 或更多位构成,准确数作为 <span class="t-lc"><a href="c-types-limits.html">CHAR_BIT</a></span> 所提供。</p>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">sizeof</span><span class="br0">(</span><span class="kw4">char</span><span class="br0">)</span></span></span> 、 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">sizeof</span><span class="br0">(</span><span class="kw4">signed</span> <span class="kw4">char</span><span class="br0">)</span></span></span> 和 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">sizeof</span><span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span><span class="br0">)</span></span></span> 始终返回 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span> 。</p>
|
|
<p><code>sizeof</code> 不能用于函数类型、不完整类型(含<span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span></span></span>)或<a href="c-language-bit_field.html">位域</a>左值。</p>
|
|
<p>应用 sizeof 到 <a href="c-language-struct.html">结构体</a>或<a href="c-language-union.html">联合体</a>类型运算数时,结果是这种对象中的总字节数,包含内部和尾随填充。尾随填充使得若对象在数组中,则此数组中下个元素的对齐要求会得到满足,换言之, sizeof(T) 返回 T[] 数组中元素的大小。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>若 <span class="t-spar">类型</span> 为 <a href="c-language-array.html">VLA</a> 类型,而更改其表达式的值不影响 sizeof 的结果,则不指定是否求值该大小表达式。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><span class="t-rev-inl t-since-c99"><span>除非 <span class="t-spar">表达式</span> 为 <a href="c-language-array.html">VLA</a> ,</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>不求值 <span class="t-spar">表达式</span> 且 <code>sizeof</code> 运算符能在整数<a href="c-language-constant_expression.html">常量表达式</a>中使用。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>若 <span class="t-spar">表达式</span> 的类型为<a href="c-language-array.html">非常量长度数组</a>类型,则求值 <span class="t-spar">表达式</span> ,并在运行时计算其所求值的数组大小。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>任何<a href="c-language-array.html">数组</a> <span class="t-c"><span class="mw-geshi c source-c">a</span></span> <span class="t-rev-inl t-since-c99"><span>,包含 VLA</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>的元素数可用表达式 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">sizeof</span> a <span class="sy2">/</span> <span class="kw4">sizeof</span> a<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span></span></span> 确定。注意若 <span class="t-c"><span class="mw-geshi c source-c">a</span></span> 拥有指针类型(例如在函数参数类型调整的数组到指针转换后),此表达式会简单地将指针类型中的字节数除以被指向类型中的字节数。</p>
|
|
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">关键词</span></h3>
|
|
<p><a href="c-keyword-sizeof.html"><tt>sizeof</tt></a></p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<p>示例输出对应拥有 64 位指针和 32 位 int 的平台</p>
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdio.h></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw4">short</span> x<span class="sy4">;</span>
|
|
<span class="co1">// 类型参数:</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof(float) = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span><span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof(void(*)(void)) = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span><span class="br0">(</span><span class="kw4">void</span><span class="br0">(</span><span class="sy2">*</span><span class="br0">)</span><span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof(char[10]) = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span><span class="br0">(</span><span class="kw4">char</span><span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="co1">// printf("sizeof(void(void)) = %zu\n", sizeof(void(void))); // 错误:函数类型</span>
|
|
<span class="co1">// printf("sizeof(char[]) = %zu\n", sizeof(char[])); // 错误:不完整类型</span>
|
|
|
|
<span class="co1">// 表达式参数:</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof 'a' = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span> <span class="st0">'a'</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 'a' 的类型为 int</span>
|
|
<span class="co1">// printf("sizeof main = %zu\n", sizeof main); // 错误:函数类型</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof &main = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span> <span class="sy3">&</span>main<span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof <span class="es1">\"</span>hello<span class="es1">\"</span> = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span> <span class="st0">"hello"</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 类型为 char[6]</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof x = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span> x<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// x 的类型为 short</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof (x+1) = %zu<span class="es1">\n</span>"</span>, <span class="kw4">sizeof</span><span class="br0">(</span>x<span class="sy2">+</span><span class="nu0">1</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// x+1 的类型为 int</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">sizeof(float) = 4
|
|
sizeof(void(*)(void)) = 8
|
|
sizeof(char[10]) = 10
|
|
sizeof 'a' = 4
|
|
sizeof &main = 8
|
|
sizeof "hello" = 6
|
|
sizeof x = 2
|
|
sizeof (x+1) = 4</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.3.4 The sizeof and _Alignof operators (p: 90-91)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.3.4 The sizeof operator (p: 80-81)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.3.3.4 The sizeof operator</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|