<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[深入浅出sizeof() ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 04 Dec 2008 07:19:14 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	sizeof()---函数用法<br/>[int占４字节,short占２字节]<br/>1.0 回答下列问题:［答案在文章末尾］<br/>1. sizeof(char) =　　　　　　　　　　　　　　　　　　　　　　　　　　　<br/>2. sizeof &#039;a&#039;&nbsp;&nbsp; = 　　　　　　　　　　　　　　　　　　　　　　　　　　<br/>3. sizeof &quot;a&quot;&nbsp;&nbsp; = 　　　　　　　　　　　　　　　　　　　　　　　<br/>4. strlen(&quot;a&quot;)) =<br/>　　如果你答对了全部四道题，那么你可以不用细看下面关于sizeof的论述。如果你答错了部分题目，<br/>&nbsp;&nbsp;&nbsp;&nbsp;那么就跟着我来一起探讨关于sizeof的用法了。　　<br/>　　对于前面的题目，我想一般有一定C基础的同志应该不会答错１和４题。至于第２题，我想应该要清楚sizeof是求字符串所占的内存。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;a&quot;在内存中的表现为a&#92;0，别忘了末尾的&#92;0也占一个字节呢。至于第２题，可能有些人会惊讶了。C 语言中，字符常数是int 型,<br/>&nbsp;&nbsp;&nbsp;&nbsp;因此 sizeof(&#039;a&#039;) 是 sizeof(int), 这是另一个与 C++ 不同的地方。既然字符常数是int 型，那么int就可以存放4个字符，<br/>&nbsp;&nbsp;&nbsp;&nbsp;我们可以得到sizeof &#039;abcd&#039;为 4。　　<br/>===========================================================================================================<br/>1.1 回答以下题目［答案在文章末尾］<br/>short (*ptr[100])[200];<br/>1. sizeof(ptr)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =<br/>2. sizeof(ptr[0])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=<br/>3. sizeof(*ptr[0])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =<br/>4. sizeof((*ptr[0])[0])) = 　　<br/>　　是不是又开始晕了。这里我们定义了一个１００个指针数组，每个指针均指向有２００个元素的数组，<br/>&nbsp;&nbsp;&nbsp;&nbsp;其内存占用为２００*sizeof(short)字节。那么这１００个数组指针的大小sizeof(ptr)为１００*sizeof(short*)。<br/>&nbsp;&nbsp;&nbsp;&nbsp;接着，指针数组的第一个指针ptr[0]指向第一个数组，所以这个指针ptr[0]的大小实际上就是一个普通指针的大小，即sizeof(short*)。<br/>&nbsp;&nbsp;&nbsp;&nbsp;*ptr[0]指向第一个数组的起始地址，所以sizeof(*ptr[0])实际上求的是第一个组的内存大小２００*sizeof(short)。<br/>&nbsp;&nbsp;&nbsp;&nbsp;(*ptr[0])[0])是第一个数组的第一个元素，因为是short型，所以这个元素的大小sizeof((*ptr[0])[0]))等价于sizeof(short)。<br/>===============================================================================================================<br/>1.2 回答以下题目［答案在文章末尾］<br/>#include &lt;stdio.h&gt;<br/>#pragma pack(push)<br/>#pragma pack(2)<br/>typedef struct _fruit<br/>{<br/>&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;apple;<br/>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; banana;<br/>&nbsp;&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; orange;&nbsp;&nbsp;<br/>&nbsp;&nbsp;double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watermelon;<br/>&nbsp;&nbsp;unsigned int&nbsp;&nbsp;plum:5;<br/>&nbsp;&nbsp;unsigned int&nbsp;&nbsp;peach:28;<br/>&nbsp;&nbsp;char*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tomato;<br/>&nbsp;&nbsp;struct fruit* next;&nbsp;&nbsp;&nbsp;&nbsp;<br/>} fruit;<br/>#pragma pack(4)<br/> <br/>typedef struct _fruit2<br/>{<br/>&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apple;<br/>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;banana;&nbsp;&nbsp;<br/>&nbsp;&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orange;<br/>&nbsp;&nbsp;double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; watermelon;<br/>&nbsp;&nbsp;unsigned int&nbsp;&nbsp; plum:5;<br/>&nbsp;&nbsp;unsigned int&nbsp;&nbsp; peach:28;&nbsp;&nbsp;<br/>&nbsp;&nbsp;char*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tomato;<br/>&nbsp;&nbsp;struct fruit2* next;&nbsp;&nbsp;&nbsp;&nbsp;<br/>} fruit2; <br/>#pragma pack(pop)<br/>int main(int argc, char *argv[])<br/>{<br/>&nbsp;&nbsp;printf(&quot;fruit=%d,fruit2=%d&#92;n&quot;,sizeof(fruit),sizeof(fruit2));<br/>}<br/>问题：打印结果为什么呢？<br/>如果你回答错误，那么你对数据结构的对齐还没有吃透。这里#pragma pack(2)强制设置编译器对齐属性为２，<br/>所以第一个数据结构以２对齐，sizeof(fruit)=(sizeof(apple)+1)+<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(banana)+<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(orange)+<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(watermelon)+<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((plum:5bit+peach:28bit+15bit)/8bit)+<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(tomato)+sizeof(next)(注意式子中1 和 15bit 表示补齐内存，使其以２对齐,),<br/>既sizeof(fruit)=(sizeof(char)+1)+sizeof(int)+sizeof(short)+sizeof(double)+sizeof(char*)+sizeof(struct fruit*)。<br/>第一个数据结构声明完了之后，又使用#pragma pack(4)强制设置编译器对齐属性为４，所以同理，<br/>可以得到sizeof(fruit2)=(sizeof(char)+3)+sizeof(int)+ (sizeof(short)+2)+sizeof(double)+((5bit+28bit+31bit)/8bit)+sizeof(char*)+sizeof(struct fruit2*)。<br/>注：#pragma pack(push)保存默认对齐，#pragma pack(pop)恢复默认对齐。<br/>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－答案:<br/>1.0: 1,4,2,1<br/>1.1: 400,4,400,2<br/>1.2: fruit=30,fruit2=36<br/>==================================================================================<br/>面试题:<br/>Intel和微软同时出现的C语言面试题:<br/>#pragma pack(8)<br/>struct s1{<br/>　　short a;<br/>　　long b;<br/>};<br/>struct s2{<br/>　　char c;<br/>　　s1 d;<br/>　　long long e;<br/>};<br/>#pragma pack()<br/>问<br/>1.sizeof(s2) = ?<br/>2.s2的s1中的a后面空了几个字节接着是b?<br/>分析:首先看s1。由于#pragma pack(8)要求8字节对齐，<br/>所以a后面需要补齐2字节，才能使该结构 8字节对齐。再看s2。d已经是8字节对齐，所以c需要补7字节才能达到8字节对齐。<br/>对于x86,long long数据类型为8字节，所以e已经8字节对齐。所以答案sizeof(s2)为24，a后面空2个字节接着b。<br/> <br/>===================================================================================<br/>内存情况:<br/>c*******<br/>aa**bbbb<br/>dddddddd<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 深入浅出sizeof() ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>