⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 [蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.htm

📁 最全的介绍C语言结构体的使用方法和使用技巧!
💻 HTM
📖 第 1 页 / 共 3 页
字号:
                        width="95%" align=center><!--
<tr><td bgcolor="#f0f3fa"><table cellspacing="0" cellpadding="0" width="100%"><td class="bold">kernelxu</td><td align="right">2005-8-30 02:38</td></tr></table></td></tr>-->
                          <TBODY>
                          <TR>
                            <TD bgColor=#def7ff><IMG height=18 
                              src="[蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.files/icon_new.gif" 
                              width=29 border=0><B>请教各位一个复杂的结构体指针问题.</B><BR><BR><!--<!--[quote][i]原帖由 &quot;spalash&quot; 发表:[/i]<br />请问这样有问题,记得以前在结构体实现变长缓冲区,都是用 <br />
char bb[1], <br />
现在对于mem2,mem2指向一片地址,请问mem2里具体成员的 <br />
地址分配?象bb[100],本来想让bb指向16个字节的缓冲区. <br />
而定义的是100,会有什么莫名的问题吗?<br />
[/quote]-->--&gt;<BR><BR>不知道我是不是理解了楼主意思,我写了一段程序来说一下我的看法:<BR>运行环境:Win2000+DEV-C++4.9.9.2<BR>[code]#include 
                              &lt;stdio.h&gt;;<BR><BR>typedef struct 
                              unit<BR>{<BR>&nbsp; &nbsp;int len;<BR>&nbsp; 
                              &nbsp;char bb[100];<BR><BR>}unit1;<BR><BR>int 
                              main(void)<BR>{<BR>&nbsp; &nbsp; unit1 
                              *mem1;<BR>&nbsp; &nbsp; unit1 *mem2;<BR>&nbsp; 
                              &nbsp; unit1 *mem3;<BR>&nbsp; &nbsp; int 
                              i;<BR>&nbsp; &nbsp; char *p;<BR>&nbsp; &nbsp; char 
                              *k = (char *)malloc(120);<BR>&nbsp; &nbsp; 
                              <BR>&nbsp; &nbsp; mem1 = (unit1 *)k;<BR>&nbsp; 
                              &nbsp; printf("mem1 = %p\n", mem1);<BR>&nbsp; 
                              &nbsp; printf("bb = %p\n", 
                              mem1-&gt;;bb);<BR>&nbsp; &nbsp; printf("k+120 = 
                              %p\n", k+120);<BR>&nbsp; &nbsp; k += 
                              104;<BR>&nbsp; &nbsp; mem2 = (unit1 *)k 
                              ;<BR>&nbsp; &nbsp; 
                              printf("****************\n");<BR>&nbsp; &nbsp; 
                              printf("mem1 = %p\n", mem1);<BR>&nbsp; &nbsp; 
                              printf("mem2 = %p\n", mem2);<BR>&nbsp; &nbsp; 
                              printf("bb = %p\n", mem2-&gt;;bb);<BR>&nbsp; 
                              &nbsp; printf("&amp;bb[13] = %p\n", 
                              &amp;mem2-&gt;;bb[13]);<BR>&nbsp; &nbsp; 
                              <BR>&nbsp; &nbsp; mem2-&gt;;bb[12] = 
                              'A';<BR>&nbsp; &nbsp; mem2-&gt;;bb[13] = 
                              'B';<BR>&nbsp; &nbsp; mem2-&gt;;bb[14] = 
                              'C';<BR>&nbsp; &nbsp; mem2-&gt;;bb[89] = 
                              'D';<BR>&nbsp; &nbsp; mem2-&gt;;bb[90] = 
                              'E';<BR>&nbsp; &nbsp; printf("bb[12] = %c\n", 
                              mem2-&gt;;bb[12]);<BR>&nbsp; &nbsp; printf("bb[13] 
                              = %c\n", mem2-&gt;;bb[13]);<BR>&nbsp; &nbsp; 
                              printf("bb[14] = %c\n", 
                              mem2-&gt;;bb[14]);<BR>&nbsp; &nbsp; printf("bb[89] 
                              = %c\n", mem2-&gt;;bb[89]);<BR>&nbsp; &nbsp; 
                              printf("bb[90] = %c\n", 
                              mem2-&gt;;bb[90]);<BR>&nbsp; &nbsp; <BR>&nbsp; 
                              &nbsp; p = (char *)malloc(120);<BR>&nbsp; &nbsp; 
                              mem3 = (unit1 *)p;<BR>&nbsp; &nbsp; mem3-&gt;;len 
                              = 10;<BR>&nbsp; &nbsp; for(i = 0; i &lt; 100; 
                              i++)<BR>&nbsp; &nbsp; {<BR>&nbsp; &nbsp;&nbsp; 
                              &nbsp;&nbsp;&nbsp;mem3-&gt;;bb[i] = i;<BR>&nbsp; 
                              &nbsp; }<BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; 
                              printf("bb[12] = %c\n", 
                              mem2-&gt;;bb[12]);<BR>&nbsp; &nbsp; printf("bb[13] 
                              = %c\n", mem2-&gt;;bb[13]);<BR>&nbsp; &nbsp; 
                              printf("bb[14] = %c\n", 
                              mem2-&gt;;bb[14]);<BR>&nbsp; &nbsp; printf("bb[89] 
                              = %c\n", mem2-&gt;;bb[89]);<BR>&nbsp; &nbsp; 
                              printf("bb[90] = %c\n", 
                              mem2-&gt;;bb[90]);<BR>&nbsp; &nbsp; <BR>&nbsp; 
                              &nbsp; system("pause");<BR>&nbsp; &nbsp; 
                              <BR>&nbsp; &nbsp; return 
                              0;<BR>}[/code]<BR>运行结果是:<BR>[code]<BR>mem1 = 
                              004624F8<BR>bb = 004624FC<BR>k+120 = 
                              00462570<BR>****************<BR>mem1 = 
                              004624F8<BR>mem2 = 00462560<BR>bb = 
                              00462564<BR>&amp;bb[13] = 00462571<BR>bb[12] = 
                              A<BR>bb[13] = B<BR>bb[14] = C<BR>bb[89] = 
                              D<BR>bb[90] = E<BR>bb[12] = A<BR>bb[13] = 
                              B<BR>bb[14] = C<BR>bb[89] = <BR>bb[90] = 
                              <BR>请按任意键继续 . . 
                              .[/code]<BR>想必你也已经看出来了:<BR>1、mem1、mem2中的成员len与结构体地址相同,bb首地址与len相差4字节。<BR>2、mem1指向120字节的存储空间,而其成员总共只占据了104个字节,对mem1成员操作均不存在问题。<BR>3、mem2指向已分配空间中从第104~120字节的块,显然mem2中归bb合法使用的内存块只有16-4=12字节了,虽然bb能访问的范围有100个字节,但是由于有100-12=88字节空间没有被分配相应的内存单元,所以如果存在再分配的情况,就有可能破坏bb[12]以后元素的内容。以上程序中的bb[89]、bb[90]就被破坏了。<BR>4、所以你的程序存在隐患。<BR>5、<!--<!--[quote]后来我要把k给释放(申请时同时把 让temp=k),相当于free(temp), <br />
释放的是120个字节? [/quote]-->--&gt;<BR>一个指针申请了多大的空间,释放该指针时就释放多少空间,不会出现申请了120个字节,释放的时候释放掉了100或130,要不然感觉系统本身就变成了个“内存大盗”了。</TD></TR></TBODY></TABLE><BR>
                        <TABLE class=tableborder cellSpacing=1 cellPadding=4 
                        width="95%" align=center><!--
<tr><td bgcolor="#f0f3fa"><table cellspacing="0" cellpadding="0" width="100%"><td class="bold">luojiannx</td><td align="right">2005-8-30 02:58</td></tr></table></td></tr>-->
                          <TBODY>
                          <TR>
                            <TD bgColor=#def7ff><IMG height=18 
                              src="[蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.files/icon_new.gif" 
                              width=29 
                              border=0><B>请教各位一个复杂的结构体指针问题.</B><BR><BR>kernelxu 
                              你申请的内存全部都没有free :P 
                              <BR><BR>现实中应该没有楼主头脑中想象的这种用法吧<BR>要是k=malloc(100),k+=20,然后free(k)?没这种搞法吧,有么?<BR><BR>我觉得楼主是多虑了</TD></TR></TBODY></TABLE><BR>
                        <TABLE class=tableborder cellSpacing=1 cellPadding=4 
                        width="95%" align=center><!--
<tr><td bgcolor="#f0f3fa"><table cellspacing="0" cellpadding="0" width="100%"><td class="bold">kernelxu</td><td align="right">2005-8-30 06:37</td></tr></table></td></tr>-->
                          <TBODY>
                          <TR>
                            <TD bgColor=#def7ff><IMG height=18 
                              src="[蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.files/icon_new.gif" 
                              width=29 border=0><B>请教各位一个复杂的结构体指针问题.</B><BR><BR><!--<!--[quote][i]原帖由 &quot;luojiannx&quot; 发表:[/i]<br />kernelxu 你申请的内存全部都没有free :P <br />
<br />
现实中应该没有楼主头脑中想象的这种用法吧<br />
要是k=malloc(100),k+=20,然后free(k)?没这种搞法吧,有么?<br />
<br />
我觉得楼主是多虑了[/quote]-->--&gt;<BR>呵呵,谢谢luojiannx提醒! 
                              :em02:&nbsp;&nbsp;:em02: <BR><BR><!--<!--[quote]现实中应该没有楼主头脑中想象的这种用法吧 <br />
要是k=malloc(100),k+=20,然后free(k)?没这种搞法吧,有么?[/quote]-->--&gt;<BR>如果真有人这么搞(比如说我现在就在我的程序里直接使用free(k)),那么调用free(k)应该是释放后80个字节吗?<BR>呵呵,还真没注意。</TD></TR></TBODY></TABLE><BR>
                        <TABLE class=tableborder cellSpacing=1 cellPadding=4 
                        width="95%" align=center><!--
<tr><td bgcolor="#f0f3fa"><table cellspacing="0" cellpadding="0" width="100%"><td class="bold">kernelxu</td><td align="right">2005-8-30 13:27</td></tr></table></td></tr>-->
                          <TBODY>
                          <TR>
                            <TD bgColor=#def7ff><IMG height=18 
                              src="[蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.files/icon_new.gif" 
                              width=29 
                              border=0><B>请教各位一个复杂的结构体指针问题.</B><BR><BR>有人来指点一下吗,我想知道我说得对不?</TD></TR></TBODY></TABLE><BR><!--<br><table cellspacing="0" cellpadding="0" width="95%" align="center"><tr><td class="bold"><font color="#000000">打印本文: </font><a href="printthread?dosc-601616" target="_blank" style="color: #000000">请教各位一个复杂的结构体指针问题.</a><br><br></td></tr></table>-->
                        <SCRIPT language=JavaScript1.1 
                        src="[蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.files/336280.js"></SCRIPT>

                        <DIV class=mid align=right>[ <A 
                        href="javascript:shutwin();">关闭窗口</A> ]</DIV><BR>
                        <CENTER>
                        <SCRIPT language=JavaScript1.1 
                        src="[蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.files/adv.js"></SCRIPT>
                        </CENTER><BR></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
        <TBODY>
        <TR>
          <TD><FONT face=arial size=1>Copyright &copy; 1999-2000 LSLNET.COM. All 
            rights reserved.</FONT><FONT face=宋体 size=1> 蓝森林网站 版权所有。</FONT></TD>
          <TD align=right><FONT face=arial size=1>E-mail : <A 
            href="mailto:webmaster@lslnet.com"><B>webmaster@lslnet.com</B></A></FONT>
            <SCRIPT language=JavaScript1.1 
            src="[蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.files/counter.js"></SCRIPT>
          </TD></TR></TBODY></TABLE>
      <CENTER></CENTER></TR></TBODY></TABLE></BASEFONT></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -