📄 [蓝森林-自由软件] - 请教各位一个复杂的结构体指针问题.htm
字号:
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]原帖由 "spalash" 发表:[/i]<br />请问这样有问题,记得以前在结构体实现变长缓冲区,都是用 <br />
char bb[1], <br />
现在对于mem2,mem2指向一片地址,请问mem2里具体成员的 <br />
地址分配?象bb[100],本来想让bb指向16个字节的缓冲区. <br />
而定义的是100,会有什么莫名的问题吗?<br />
[/quote]-->--><BR><BR>不知道我是不是理解了楼主意思,我写了一段程序来说一下我的看法:<BR>运行环境:Win2000+DEV-C++4.9.9.2<BR>[code]#include
<stdio.h>;<BR><BR>typedef struct
unit<BR>{<BR> int len;<BR>
char bb[100];<BR><BR>}unit1;<BR><BR>int
main(void)<BR>{<BR> unit1
*mem1;<BR> unit1 *mem2;<BR>
unit1 *mem3;<BR> int
i;<BR> char *p;<BR> char
*k = (char *)malloc(120);<BR>
<BR> mem1 = (unit1 *)k;<BR>
printf("mem1 = %p\n", mem1);<BR>
printf("bb = %p\n",
mem1->;bb);<BR> printf("k+120 =
%p\n", k+120);<BR> k +=
104;<BR> mem2 = (unit1 *)k
;<BR>
printf("****************\n");<BR>
printf("mem1 = %p\n", mem1);<BR>
printf("mem2 = %p\n", mem2);<BR>
printf("bb = %p\n", mem2->;bb);<BR>
printf("&bb[13] = %p\n",
&mem2->;bb[13]);<BR>
<BR> mem2->;bb[12] =
'A';<BR> mem2->;bb[13] =
'B';<BR> mem2->;bb[14] =
'C';<BR> mem2->;bb[89] =
'D';<BR> mem2->;bb[90] =
'E';<BR> printf("bb[12] = %c\n",
mem2->;bb[12]);<BR> printf("bb[13]
= %c\n", mem2->;bb[13]);<BR>
printf("bb[14] = %c\n",
mem2->;bb[14]);<BR> printf("bb[89]
= %c\n", mem2->;bb[89]);<BR>
printf("bb[90] = %c\n",
mem2->;bb[90]);<BR> <BR>
p = (char *)malloc(120);<BR>
mem3 = (unit1 *)p;<BR> mem3->;len
= 10;<BR> for(i = 0; i < 100;
i++)<BR> {<BR>
mem3->;bb[i] = i;<BR>
}<BR> <BR>
printf("bb[12] = %c\n",
mem2->;bb[12]);<BR> printf("bb[13]
= %c\n", mem2->;bb[13]);<BR>
printf("bb[14] = %c\n",
mem2->;bb[14]);<BR> printf("bb[89]
= %c\n", mem2->;bb[89]);<BR>
printf("bb[90] = %c\n",
mem2->;bb[90]);<BR> <BR>
system("pause");<BR>
<BR> 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>&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]-->--><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]原帖由 "luojiannx" 发表:[/i]<br />kernelxu 你申请的内存全部都没有free :P <br />
<br />
现实中应该没有楼主头脑中想象的这种用法吧<br />
要是k=malloc(100),k+=20,然后free(k)?没这种搞法吧,有么?<br />
<br />
我觉得楼主是多虑了[/quote]-->--><BR>呵呵,谢谢luojiannx提醒!
:em02: :em02: <BR><BR><!--<!--[quote]现实中应该没有楼主头脑中想象的这种用法吧 <br />
要是k=malloc(100),k+=20,然后free(k)?没这种搞法吧,有么?[/quote]-->--><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 © 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 + -