﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-金鳞-随笔分类-c</title><link>http://www.cnitblog.com/chenxin9821/category/8083.html</link><description>目标-&gt;软件测试架构师</description><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 20:38:55 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 20:38:55 GMT</pubDate><ttl>60</ttl><item><title>c的随堂笔记（更新中）</title><link>http://www.cnitblog.com/chenxin9821/archive/2009/03/13/55395.html</link><dc:creator>金鳞</dc:creator><author>金鳞</author><pubDate>Fri, 13 Mar 2009 08:58:00 GMT</pubDate><guid>http://www.cnitblog.com/chenxin9821/archive/2009/03/13/55395.html</guid><wfw:comment>http://www.cnitblog.com/chenxin9821/comments/55395.html</wfw:comment><comments>http://www.cnitblog.com/chenxin9821/archive/2009/03/13/55395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chenxin9821/comments/commentRss/55395.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chenxin9821/services/trackbacks/55395.html</trackback:ping><description><![CDATA[<p>2009.3.12<br><br>shizh:能用钱解决的问题都不是问题，问题是没有钱。 说:<br><span style="COLOR: #000000; FONT-FAMILY: 宋体">const char* ptr； char *const ptr；这两种方式是不一样的，一个修饰类型一个修饰指针，修饰指针的这个指针的地址不可以改变，修饰类型的这个指针所指向的内容不能变。<br></span><br>海阔天空 说:<br><span style="COLOR: #000000; FONT-FAMILY: 宋体">const char* ptr：是修饰类型的，可以看做 （const char*）ptr,既然char* 是const，那么能变的只能是ptr，也就是地址能变内容不能变。 char *const ptr：是修饰指针的，可以看做char （*const ptr），既然*ptr是const，那么就是内容不能变地址能变。</span><br><span style="COLOR: #000000; FONT-FAMILY: 宋体">我是这么理解的 - - 对不？<br><br></span>shizh:能用钱解决的问题都不是问题，问题是没有钱。 说:<br><span style="COLOR: #000000; FONT-FAMILY: 宋体">char *const ptr 是修饰指针的，可以看做char （*const ptr），既然*ptr是const，那么就是内容不能变地址能变。--------这个地方不对，应该是内容能变地址不能变。<br></span><br>海阔天空 说:<br><br>有个地方错了，应该是 <span style="COLOR: #000000; FONT-FAMILY: 宋体">char *const ptr 是修饰指针的，可以看做char （*const ptr），既然ptr是const，那么就是内容能变地址不能变。<br><br><br>举个例子<br>shell_老汤(13129252) 17:34:01<br>to 小新<br>char g_szTest[]="iiiii";<br>char g_szTest2[]="2222";<br>int main(int argc, char* argv[])<br>{<br>&nbsp;const char* ptr=g_szTest;<br>&nbsp;printf("%s\n", ptr);//iiii<br>&nbsp;char *const ptr2 = g_szTest2;<br>&nbsp;printf("%s\n", ptr2);//2222<br>&nbsp;ptr="aaaa";<br>&nbsp;printf("%s\n", ptr);//aaaa<br>&nbsp;//*ptr="bbb";//error<br>&nbsp;//ptr2="bbb";//error<br>&nbsp;// ptr2=ptr;//error<br>&nbsp;*ptr2=*ptr;<br>&nbsp;printf("%s\n", ptr2);//a222<br>&nbsp;return 0;<br>}<br><br><br>const char *ptr&nbsp; --- 常用做函数参数。当你不希望该函数改变参数内容时。<br>exp<br>void fun(const char *pszInput, char *pszOut);<br><br>老堂大好人 ；）<br></span><br>********************************************************************************************************<br>2009.3.13<br><br>perl_小新 15:21:58<br>c_config *conf = g_share_map-&gt;conf;<br><br>c++_cracker007&nbsp; 15:23:11<br>取g_share_map所指结构的一个成员（conf），该成员是指向_c_config的指针，把这个指针赋给conf 。 <br><br>perl_小新 17:43:09<br>007 - -<br>perl_小新 17:43:16<br>c++_cracker007&nbsp; 15:23:11<br>取g_share_map所指结构的一个成员（conf），该成员是指向_c_config的指针，把这个指针赋给conf 。 <br>perl_小新 17:44:05<br>你这句话里 ，指针 表示 指针变量 还是 地址？<br>c++_cracker007 17:44:52<br>不知道你的意思。<br>int a; int* p; p=&amp;a;<br>我所说的"指针"就是p<br>perl_小新 17:45:07<br>那就是地址<br>perl_小新 17:45:20<br>呃 我想想<br>LOVE CODE 17:46:11<br>唉，我已经忘了指针是什么东东了<br>perl_小新 17:46:40<br>小蓝 也总 唉唉唉的 。<br>perl_小新 17:46:50<br>年纪轻轻的 ，至于吗<br>旋木 17:47:05<br>bu zhiyu,heihei<br>perl_小新 17:47:11<br>；）<br>perl_小新 17:48:12<br>- - 007<br>perl_小新 17:48:33<br>c++_cracker007&nbsp; 15:23:11<br>取g_share_map所指结构的一个成员（conf），该成员是指向_c_config的指针，把这个指针赋给conf 。//最后那句话，应该是把地址给了conf吧？<br>c++_cracker007 17:49:15<br>int a;<br>int* p;<br>p=&amp;a;<br>这个p叫做指针变量。<br>perl_小新 17:49:42<br>指针变量的内容是地址<br>c++_cracker007 17:50:30<br>int b;<br>int a=b;<br>把变量b赋给a<br>int* p1=&amp;b;<br>int* p2;<br>p2=p1;<br>把变量p1赋给p2.<br>就是这个意思。<br>perl_小新 17:51:06<br>那就是地址 - -<br>c++_cracker007 17:51:12<br>这里一般都是说指针或指针变量。说地址一般被理解为&amp;p<br>c++_cracker007 17:52:06<br>a=*p&nbsp; //指针指向的值赋给a<br>a=p&nbsp; //指针赋给a<br>a=&amp;p //指针的地址赋给a</p>
<p>一般的说法。<br>perl_小新 17:52:13<br>地址我理解为指针变量肚子里的东西<br>c++_cracker007 17:52:37<br>没错的，你理解了就行。因为一般说都是直接说指针。因为地址有很多地址<br>perl_小新 17:52:43<br>恩<br>**************************************************************************************************<br>&nbsp;2009.3.16 </p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:41:51</span></p>
<p><span>007</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:41:59</span></p>
<p><span>struct name1{ </span></p>
<p><span>char str; </span></p>
<p><span>short x; </span></p>
<p><span>int num; </span></p>
<p><span>} </span></p>
<p>&nbsp;</p>
<p><span>struct name2{ </span></p>
<p><span>char str; </span></p>
<p><span>int num; </span></p>
<p><span>short x; </span></p>
<p><span>} </span></p>
<p>&nbsp;</p>
<p><span>sizeof(struct name1)=____________,</span></p>
<p><span>sizeof(struct name2)= ____________,</span></p>
<p>&nbsp;</p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:42:43</span></p>
<p><span>char 2 short 2 int 2 </span><span>，第一个是</span><span>6</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:43:00</span></p>
<p><span>char 2</span></p>
<p><span>int 2 </span></p>
<p><span>这两个都错了</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:43:25</span></p>
<p><span>32</span><span>位平台上，</span><span>char 1 short 2 int 4</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:43:56</span></p>
<p><span>007 </span><span>是什么顺序了？</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:44:10</span></p>
<p><span>以大的为准，对吗</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:44:17</span></p>
<p><span>咱们先不讨论顺序。</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:44:25</span></p>
<p><span>- - </span><span>讨论啥？</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:44:29</span></p>
<p><span>顺序那个是深一点的话题了。</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:44:38</span></p>
<p><span>你要先搞清楚基本的类型大小</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:45:01</span></p>
<p><span>&#8220;</span><span>32</span><span>位平台上，</span><span>char 1 short 2 int <st1:chmetcnv UnitName="&#8221;" SourceValue="4" HasSpace="False" Negative="False" NumberType="1" TCSC="0" w:st="on">4<span><span>&#8221;</span></span></st1:chmetcnv><span>我暂且记下了</span></span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:45:18</span></p>
<p><span>然后呢</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:45:35</span></p>
<p><span>ok.</span><span>现在把顺序加进来。实际上你说的&#8220;顺序&#8221;是由于</span><span>alignment</span><span>造成的</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:45:47</span></p>
<p><span>如果你想要和顺序没关系的话，用</span><span>pragma</span><span>屏蔽一下</span><span>alignment.</span><span>或者可以调整默认的</span><span>alignment.</span></p>
<p><span>我被</span><span>perl</span><span>染了色</span><span>&nbsp;16:46:22</span></p>
<p><span>7</span><span>仔，你别说的这么深奥了，小新不懂</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:46:38</span></p>
<p><span>和顺序有关系的呢？</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:46:49</span></p>
<p><span>比如</span><span>#pragma pack(1)</span></p>
<p><span>这样就是和顺序无关，严格按照类型大小计算。当然是以降低性能为代价</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:47:11</span></p>
<p><span>32</span><span>位平台上，指针一次跨越</span><span>4</span><span>个字节，因此默认的</span><span>alighment</span><span>是</span><span>4</span><span>字节。</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:47:28</span></p>
<p><span>所以，把这个考虑进去之后，才和顺序有关系</span></p>
<p><span>我被</span><span>perl</span><span>染了色</span><span>&nbsp;16:47:37</span></p>
<p><span>&nbsp;c++_cracker007<span>&nbsp;&nbsp; </span>16:48:36</span></p>
<p><span>这个明白不？明白我就继续讨论你那道题的结果</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:48:41</span></p>
<p><span>不</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:49:25</span></p>
<p><span>貌似很难解释的样子，如果你不太了解</span><span>32</span><span>位平台的一些硬件特性。</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:49:42</span></p>
<p><span>&nbsp;</span><span>那就继续讲我那道题</span><span> </span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:49:50</span></p>
<p><span>我可以记下来</span> <span>以后慢慢懂</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:50:04</span></p>
<p><span>不行的，必须先讲清楚这个概念，否则你不知其所以然。</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:50:28</span></p>
<p><span>这是一个结构体，关指针什么事情呢</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:51:05</span></p>
<p><span>因为这个结果关系到</span><span>alignment.</span><span>而</span><span>alignment</span><span>在不同平台是不同的。这么说吧，你这道题的结果在不同平台、不同编译指令的作用下可以千变万化。</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:51:40</span></p>
<p><span>要</span><span>win32</span><span>的</span><span> - -</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:51:50</span></p>
<p><span>16</span><span>位平台下，默认编译指令，</span><span>name1=6,name2=6</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:52:02</span></p>
<p><span>32</span><span>位平台下，默认编译指令，</span><span>name1=8,name2=12</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:52:22</span></p>
<p><span>咋算的？</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:52:48</span></p>
<p><span>所以我要告诉你</span><span>alignment</span><span>的概念啊。明白这个你才知道什么原因</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:52:58</span></p>
<p><span>汉语啥意思？</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:53:12</span></p>
<p><span>内存对齐</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;16:53:42</span></p>
<p><span>你先讲</span> <span>我拦住开发</span></p>
<p><span>我被</span><span>perl</span><span>染了色</span><span>&nbsp;16:54:07</span></p>
<p><span>不对齐会不会溢出啊</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:54:30</span></p>
<p><span>不会的，和这个没关系</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:55:24</span></p>
<p><span>32</span><span>位平台上，</span><span>cpu</span><span>寻址是按照</span><span>4</span><span>字节的。原因是，顾名思义，</span><span>32</span><span>位就是数据总线和地址总线都是</span><span>32</span><span>位的，因此</span><span>cpu</span><span>一次传送</span><span>32</span><span>位</span><span>==4</span><span>字节数据。所以，如果你的数据不在可以被</span><span>4</span><span>整除的内存边界上，</span><span>cpu</span><span>需要重新寻址，这样性能就降低了。</span></p>
<p><span>为此，编译器默认在编译时都会把数据按照</span><span>cpu</span><span>指针长度，对齐于内存边界。当然，你可以使用编译指令更改这一默认行为</span></p>
<p><span>我被</span><span>perl</span><span>染了色</span><span>&nbsp;16:56:21</span></p>
<p><span>嗯</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:56:45</span></p>
<p><span>对于</span><span>name2,</span><span>在</span><span>32</span><span>位平台下默认编译方式的情况下，</span><span>char</span><span>是</span><span>1</span><span>字节，为了</span><span>alignment,</span><span>编译器会把其后的数据安排在下一个</span><span>4</span><span>字节处。导致的直接结果是</span><span>char</span><span>看上去占了</span><span>4</span><span>个字节</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:58:15</span></p>
<p><span>对于</span><span>name1,</span><span>由于</span><span>short</span><span>默认是</span><span>2</span><span>字节，和</span><span>char</span><span>可以在</span><span>1</span><span>个字节下挤下，因此编译器会让</span><span>char</span><span>和</span><span>short</span><span>放在一个</span><span>4</span><span>字节单元，剩下的一个</span><span>int</span><span>继续按照对齐方式，放于下一个</span><span>4</span><span>字节单元，因此一共要占</span><span>8</span><span>字节</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>16:59:04</span></p>
<p><span>name2</span><span>刚才说了，</span><span>char</span><span>和</span><span>int</span><span>分别占了</span><span>4</span><span>字节，剩下的</span><span>short</span><span>刚好从</span><span>4</span><span>字节边界开始，但是为了其后数据的对齐，</span><span>short</span><span>也被</span><span>"</span><span>扩充为</span><span>"4</span><span>字节，因此一共是</span><span>12</span><span>字节</span></p>
<p><span>我被</span><span>perl</span><span>染了色</span><span>&nbsp;16:59:55</span></p>
<p><span>&nbsp;</span><span>不足补</span><span>0</span></p>
<p><span>perl_shadow&nbsp;17:00:29</span></p>
<p><span>U16 array[255];</span></p>
<p><span>char*temp="</span><span>严</span><span>";</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span>if((mbstowcs(array,temp, strlen(temp)))==-1) </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ printf("error\n"); }</span></p>
<p><span>你这样试试？我这边一直返回</span><span>-1</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:01:46</span></p>
<p><span>U16</span><span>？这个不是标准类型吧</span></p>
<p><span>perl_shadow&nbsp;17:02:18</span></p>
<p><span>typedef unsigned short<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>U16;</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:02:59</span></p>
<p><span>我这里可以转换</span></p>
<p><span>perl_shadow&nbsp;17:03:17</span></p>
<p><span>那就是系统问题</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:03:18</span></p>
<p><span>不是，你转换中文要先</span><span>setlocale</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:03:38</span></p>
<p><span>setlocale(LC_ALL,"zh_CN.GB2312");</span></p>
<p><span>perl_shadow&nbsp;17:04:06</span></p>
<p><span>我看下，问题是我这边的默认字符集不知道有哪些</span></p>
<p><span>perl_shadow&nbsp;17:04:16</span></p>
<p><span>我是从中文转为</span><span>U16</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:04:29</span></p>
<p><span>我这里也是的</span></p>
<p><span>perl_shadow&nbsp;17:05:14</span></p>
<p><span>setlocale(LC_ALL,"zh_CN.GB2312");</span></p>
<p><span>这个设置的是被转字符集？</span></p>
<p><span>perl_shadow&nbsp;17:05:24</span></p>
<p><span>看来我理解反了</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:05:30</span></p>
<p><span>是啊</span></p>
<p><span>perl_shadow&nbsp;17:10:47</span></p>
<p><span>还是不行</span></p>
<p><span>perl_shadow&nbsp;17:12:42</span></p>
<p><span>代码基本一样</span></p>
<p><span>perl_shadow&nbsp;17:12:50</span></p>
<p><span>只可能是系统差别</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:13:50</span></p>
<p><span>我的系统上全都是</span><span>en_US,</span><span>这个是最基本的了</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:13:55</span></p>
<p><span>没有其它字符集了</span></p>
<p><span>perl_shadow&nbsp;17:17:44</span></p>
<p><span>locale -a</span><span>只有一种吗？</span></p>
<p><span>perl_shadow&nbsp;17:18:03</span></p>
<p><span>我这上面看不到</span><span>LOCALE</span><span>，根本不清楚有哪些字符集</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:18:56</span></p>
<p><span>搞定开发了，我来理解下</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:19:00</span></p>
<p><span>我的</span><span>locale -a</span><span>全都是</span><span>en_US.</span><span>我装系统的时候自己手动调的</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:20:03</span></p>
<p><span>正常的话有很多的，</span><span>zh_CN,</span><span>乱七八糟的一些国家</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:21:05</span></p>
<p><span>也想起来那个问题了</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:21:17</span></p>
<p><span>写一个</span><span>"</span><span>标准</span><span>"</span><span>宏</span><span>MIN </span><span>，这个宏输入两个参数并返回较小的一个</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:21:26</span></p>
<p><span>介个也不会</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:21:43</span></p>
<p><span>要用</span><span>#define,</span><span>是吗</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:21:54</span></p>
<p><span>还是</span><span>typedef</span><span>？</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:22:00</span></p>
<p><span>#define MIN(a,b)&nbsp;(a&lt;b?a:b)</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:23:37</span></p>
<p><span>12</span><span>、请问以下代码有什么问题：</span><span> </span></p>
<p><span>int main() </span></p>
<p><span>{ </span></p>
<p><span>char a; </span></p>
<p><span>char *str=&amp;a; </span></p>
<p><span>strcpy(str,"hello"); </span></p>
<p><span>printf(str); </span></p>
<p><span>return 0; </span></p>
<p><span>} </span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>int main() </span></p>
<p><span>{ </span></p>
<p><span>char str1[5]={&#8216;a&#8217;,&#8217;b&#8217;,&#8217;c&#8217;,&#8217;d&#8217;,&#8217;e&#8217;};</span></p>
<p><span>char str2[6];</span></p>
<p><span>strcpy(str2,str1); </span></p>
<p><span>printf(str2); </span></p>
<p><span>return 0; </span></p>
<p><span>} </span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:24:43</span></p>
<p><span>strcpy(str,"hello"); //</span><span>这个空间不够。</span></p>
<p><span>strcpy(str2,str1); //</span><span>这个缺少</span><span>\0</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:29:42</span></p>
<p><span>13</span><span>、写出程序运行结果</span><span> </span></p>
<p><span>int sum(int a) </span></p>
<p><span>{ </span></p>
<p><span>auto int c=0; </span></p>
<p><span>static int b=3; </span></p>
<p><span>c+=1; </span></p>
<p><span>b+=2; </span></p>
<p><span>return(a+b+c); </span></p>
<p><span>} </span></p>
<p>&nbsp;</p>
<p><span>void main() </span></p>
<p><span>{ </span></p>
<p><span>int I; </span></p>
<p><span>int a=2; </span></p>
<p><span>for(I=0;I&lt;5;I++) </span></p>
<p><span>{ </span></p>
<p><span>printf("%d,", sum(a)); </span></p>
<p><span>} </span></p>
<p><span>} </span></p>
<p>&nbsp;</p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:29:59</span></p>
<p><span>要过程也要结果</span><span> - -</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:30:57</span></p>
<p><span>你自己推导一下，写一写就出来了。</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:30:59</span></p>
<p><span>a b c </span><span>都是不一样的变量，每次一个循环结束后，有些值是保留的，有些是不保留的</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:31:53</span></p>
<p><span>第一次，</span><span>a b c </span><span>是</span><span> 2 3 0 </span><span>，</span><span>sum =5</span><span>；</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:32:25</span></p>
<p><span>- - </span><span>不会</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:32:57</span></p>
<p><span>第一次怎么是</span><span>2</span><span>，</span><span>3</span><span>，</span><span>0</span><span>呢。</span><span>c</span><span>和</span><span>b</span><span>都做了加法运算的</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:33:11</span></p>
<p><span>那我重算</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:33:29</span></p>
<p><span>第一次</span><span> abc</span><span>是</span><span>2 5 1 sum=8</span><span>；</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:33:57</span></p>
<p><span>对呀。继续下去你就算出来了</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:34:58</span></p>
<p><span>第二次</span><span> abc </span><span>是</span><span> 2 7 1 sum=10</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:35:00</span></p>
<p><span>- - </span><span>这个对吗</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:35:15</span></p>
<p><span>对呀</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:35:32</span></p>
<p><span>&nbsp;</span><span>怎么会这样</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:36:42</span></p>
<p><span>第三次</span><span> abc </span><span>是</span><span>2 9 1 sum =12</span><span>；第四次</span><span> abc</span><span>是</span><span> 2 11 1 sum14</span><span>；第五次</span><span> abc</span><span>是</span><span> 2 13 1 sum</span><span>是</span><span>16.</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:36:47</span></p>
<p><span>这道题是我自己做的</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:37:56</span></p>
<p><span>14</span><span>、有关内存的思考题</span></p>
<p><strong>&nbsp;</strong></p>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=291>
            <p><span>void GetMemory(char *p)</span></p>
            <p><span>{</span></p>
            <p><span>p = (char *)malloc(100);</span></p>
            <p><span>}</span></p>
            <p><span>void Test(void) </span></p>
            <p><span>{</span></p>
            <p><span>char *str = NULL;</span></p>
            <p><span>GetMemory(str);<span>&nbsp;&nbsp; </span></span></p>
            <p><span>strcpy(str, "hello world");</span></p>
            <p><span>printf(str);</span></p>
            <p><span>}</span></p>
            <p>&nbsp;</p>
            <p><span>请问运行<span>Test</span>函数会有什么样的结果？</span></p>
            <p><span>答：内存泄露且非法访问，</span></p>
            <p><span>指针是值传递，</span><span>p</span><span>和</span><span>str</span><span>无关。一方面造成</span><span>p</span><span>的内存泄露，一方面造成</span><span>str</span><span>没有拿到内存，即非法访问。</span></p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=291>
            <p><span>char *GetMemory(void)</span></p>
            <p><span>{<span>&nbsp;&nbsp; </span></span></p>
            <p><span>char p[] = "hello world";</span></p>
            <p><span>return p;</span></p>
            <p><span>}</span></p>
            <p><span>void Test(void)</span></p>
            <p><span>{</span></p>
            <p><span>char *str = NULL;</span></p>
            <p><span>str = GetMemory();<span>&nbsp;&nbsp;&nbsp; </span></span></p>
            <p><span>printf(str);</span></p>
            <p><span>}</span></p>
            <p>&nbsp;</p>
            <p><span>请问运行<span>Test</span>函数会有什么样的结果？</span></p>
            <p><span>答：非法访问，</span></p>
            <p><span>返回的</span><span>p</span><span>指向栈内存，</span><span>GetMemory</span><span>返回后这部分内存被回收，造成非法访问。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=291>
            <p><span>Void GetMemory2(char **p, int num)</span></p>
            <p><span>{</span></p>
            <p><span>*p = (char *)malloc(num);</span></p>
            <p><span>}</span></p>
            <p><span>void Test(void)</span></p>
            <p><span>{</span></p>
            <p><span>char *str = NULL;</span></p>
            <p><span>GetMemory(&amp;str, 100);</span></p>
            <p><span>strcpy(str, "hello");<span>&nbsp;&nbsp; </span></span></p>
            <p><span>printf(str);<span>&nbsp;&nbsp;&nbsp; </span></span></p>
            <p><span>}</span></p>
            <p><span>请问运行<span>Test</span>函数会有什么样的结果？</span></p>
            <p><span>答：</span><span>ok</span><span>，</span></p>
            <p><span>二级指针</span><span>p</span><span>用来模拟</span><span>str</span><span>的引用传递，因此没问题</span></p>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=291>
            <p><span>void Test(void)</span></p>
            <p><span>{</span></p>
            <p><span>char *str = (char *) malloc(100);</span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>strcpy(str, </span><span>&#8220;</span><span>hello</span><span>&#8221;</span><span>);</span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>free(str);&nbsp;<span>&nbsp;&nbsp;&nbsp; </span></span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>if(str != NULL)</span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>{</span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;strcpy(str, </span><span>&#8220;</span><span>world</span><span>&#8221;</span><span>);<span> </span></span></p>
            <p><span>printf(str);</span></p>
            <p><span>}</span></p>
            <p><span>}</span></p>
            <p><span>请问运行<span>Test</span>函数会有什么样的结果？</span></p>
            <p><span>答：非法访问，str被free后变成了野指针。<br></span><span><br></span></p>
            <p>&nbsp;Linux_菊花晶(59958678)&nbsp; 9:41:46<br>str 指向那块内存,就相当于你说那是你家房子.<br>free掉就是卖了.</p>
            <p>你房子都卖了,还非要说那是你家的,能不出问题么? <br>Linux_菊花晶(59958678)&nbsp; 9:45:29<br>问题是原来的malloc出来的那段内存有结束符,你free掉以后就没有结束符了. <br>Linux_菊花晶(59958678)&nbsp; 9:46:11<br>你给出str指针,往下找结束符的时候,就会出错 <br>Linux_菊花晶(59958678)&nbsp; 9:47:36<br>是这个理吧 <br><br><br>php-木头人(445498529)&nbsp; 9:37:37<br>小新那代码是危险代码啊<br>perl_小新(147551562)&nbsp; 9:37:44<br>- - <br>perl_小新(147551562)&nbsp; 9:37:57<br>我在编译器里走的，啥危险啊？<br>Linux_菊花晶(59958678)&nbsp; 9:38:09<br>能编译的过? <br>perl_小新(147551562)&nbsp; 9:38:19<br>你再说危险 ，我就换机器了，吓人的。<br>perl_小新(147551562)&nbsp; 9:38:28<br>能啊 ，黑屏都出来了<br>php-木头人(445498529)&nbsp; 9:38:28<br>free了后就不应该有任何其它的操作了<br>Linux_菊花晶(59958678)&nbsp; 9:38:50<br>有啊.应该加上 str =null <br>perl_小新(147551562)&nbsp; 9:38:55<br>free应该没成功，啥都没打印出来。<br>php-木头人(445498529)&nbsp; 9:39:07<br>free成功了的,<br>perl_小新(147551562)&nbsp; 9:39:29<br>free不成功打印hello，不成功打印world<br>perl_小新(147551562)&nbsp; 9:39:41<br>可是虾米也木有。<br>Linux_菊花晶(59958678)&nbsp; 9:39:42<br>就是str指针野了,以后的操作后果都是未知的 <br>php-木头人(445498529)&nbsp; 9:39:57<br>嗯.<br>php-木头人(445498529)&nbsp; 9:40:19<br>虾米也木有就是那指针烂掉了.</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:45:43</span></p>
<p><span>我只知道</span><span>malloc</span><span>是分配内存的</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:46:32</span></p>
<p><span>内存导致的问题也就是内存溢出</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:47:01</span></p>
<p><span>我的软件测评师教程</span> <span>到了</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:47:11</span></p>
<p><span>左上内存泄露且非法访问</span></p>
<p><span>右上非法访问</span></p>
<p><span>左下没问题</span></p>
<p><span>右下非法访问</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:47:13</span></p>
<p><span>晚上</span> <span>有书看了</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:47:32</span></p>
<p><span>如果我问</span> <span>为什么，你介意吗？</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:48:04</span></p>
<p><span>我觉得你应该先放下</span><span>windows</span><span>程序设计，先补补</span><span>c</span><span>基础</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:48:17</span></p>
<p><span>很对</span> <span>，我周末贪玩了</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:48:58</span></p>
<p><span>解释可以，但是你真的要去好好看看</span><span>c</span><span>的基础书，否则基础不牢会吃大亏的。</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:49:22</span></p>
<p><span>嗯</span> <span>我会的，一个月以后考试</span> <span>也会用到，我一定要看。</span></p>
<p><span>c++_cracker007<span>&nbsp;&nbsp; </span>17:52:09</span></p>
<p><span>左上，指针是值传递，</span><span>p</span><span>和</span><span>str</span><span>无关。一方面造成</span><span>p</span><span>的内存泄露，一方面造成</span><span>str</span><span>没有拿到内存，即非法访问。</span></p>
<p><span>右上，返回的</span><span>p</span><span>指向栈内存，</span><span>GetMemory</span><span>返回后这部分内存被回收，造成非法访问</span></p>
<p><span>左下，二级指针</span><span>p</span><span>用来模拟</span><span>str</span><span>的引用传递，因此没问题</span></p>
<p><span>右下，</span><span>free</span><span>并不能把</span><span>str</span><span>清为</span><span>0(NULL)</span></p>
<p><span>perl_</span><span>小新</span><span>&nbsp;17:52:28</span></p>
<p><span>&nbsp;</span></p>
<p><span>perl_shadow&nbsp;17:57:46</span></p>
<p><span>malloc</span><span>完要判断内存是否为空吧</span></p>
<p><span>c++_cracker007</span></p>
<p><span>经常判断是个好习惯。<br>***********************************************<br>20090323<br><br>c_D&nbsp;&nbsp;&nbsp; 14:15:12<br>&nbsp; const char_t&amp; cSearch = *lpszSearch;//啥意思<br>c++_cracker007&nbsp;&nbsp; 14:16:29<br>定义一个宽字符常量的引用cSearch,初始化为后面那个字符串的首字符<br>**********************************************************************<br>c_D 16:30:29<br>::GetModuleFileName(NULL,pathw,256);//有这样写的吗？前边那两个冒号<br><br>冒号的前边空着可以吗？<br>php-木头人 16:30:50<br>可以<br>c_D &nbsp;16:30:59<br>那默认是啥呢？<br>php-木头人 16:31:15<br>带::和不带是一样的。<br>Linux_风花雪月 16:31:19<br>呵呵<br>c_D 16:31:24<br>那为啥要加上呢？<br>Linux_风花雪月 16:31:24<br>默认是自己<br>c++_cracker007 16:31:26<br>不一样的<br>php-木头人 16:31:31<br>::代表域的符号<br>php-木头人 16:31:40<br>如果<br>:: 前面是空的话，就是全域<br>php-木头人&nbsp; 16:32:04<br>默认是全域的, 除非在类里面有相同的成员函数<br>c++_cracker007&nbsp; 16:32:12<br>::F() 这个是调用全局名字空间的符号<br>F() 这个是使用当前名字空间的符号<br>c++_cracker007&nbsp; 16:32:59<br>GetModule这个是sdk的函数，是全局名字空间的，所以要::<br>**************************************************************<br><br>Linux_稀滥16:20:34<br>用的SecureCRT，是默认的字符集<br>Mysql_To Study16:20:46<br>default ?<br>内核_YangNas16:21:02<br>改成UTF-8的，然后保存，然后重新登陆<br>Linux_稀滥16:21:17<br>嗯，default<br>Mysql_To Study 16:21:38<br>export LANG=US_UTF-8 然后把client 调成utf8<br>Mysql_To Study16:22:05<br>否则修改/etc/sysconfig/i18n<br>Linux_稀滥16:22:22<br>嗯，好了</span></p>
<img src ="http://www.cnitblog.com/chenxin9821/aggbug/55395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chenxin9821/" target="_blank">金鳞</a> 2009-03-13 16:58 <a href="http://www.cnitblog.com/chenxin9821/archive/2009/03/13/55395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>