?? [藍(lán)森林-自由軟件] - 請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.htm
字號(hào):
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="[藍(lán)森林-自由軟件] - 請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.files/icon_new.gif"
width=29 border=0><B>請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.</B><BR><BR><!--<!--[quote][i]原帖由 "spalash" 發(fā)表:[/i]<br />請(qǐng)問(wèn)這樣有問(wèn)題,記得以前在結(jié)構(gòu)體實(shí)現(xiàn)變長(zhǎng)緩沖區(qū),都是用 <br />
char bb[1], <br />
現(xiàn)在對(duì)于mem2,mem2指向一片地址,請(qǐng)問(wèn)mem2里具體成員的 <br />
地址分配?象bb[100],本來(lái)想讓bb指向16個(gè)字節(jié)的緩沖區(qū). <br />
而定義的是100,會(huì)有什么莫名的問(wèn)題嗎?<br />
[/quote]-->--><BR><BR>不知道我是不是理解了樓主意思,我寫(xiě)了一段程序來(lái)說(shuō)一下我的看法:<BR>運(yùn)行環(huán)境: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>運(yùn)行結(jié)果是:<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>請(qǐng)按任意鍵繼續(xù) . .
.[/code]<BR>想必你也已經(jīng)看出來(lái)了:<BR>1、mem1、mem2中的成員len與結(jié)構(gòu)體地址相同,bb首地址與len相差4字節(jié)。<BR>2、mem1指向120字節(jié)的存儲(chǔ)空間,而其成員總共只占據(jù)了104個(gè)字節(jié),對(duì)mem1成員操作均不存在問(wèn)題。<BR>3、mem2指向已分配空間中從第104~120字節(jié)的塊,顯然mem2中歸bb合法使用的內(nèi)存塊只有16-4=12字節(jié)了,雖然bb能訪問(wèn)的范圍有100個(gè)字節(jié),但是由于有100-12=88字節(jié)空間沒(méi)有被分配相應(yīng)的內(nèi)存單元,所以如果存在再分配的情況,就有可能破壞bb[12]以后元素的內(nèi)容。以上程序中的bb[89]、bb[90]就被破壞了。<BR>4、所以你的程序存在隱患。<BR>5、<!--<!--[quote]后來(lái)我要把k給釋放(申請(qǐng)時(shí)同時(shí)把 讓temp=k),相當(dāng)于free(temp), <br />
釋放的是120個(gè)字節(jié)? [/quote]-->--><BR>一個(gè)指針申請(qǐng)了多大的空間,釋放該指針時(shí)就釋放多少空間,不會(huì)出現(xiàn)申請(qǐng)了120個(gè)字節(jié),釋放的時(shí)候釋放掉了100或130,要不然感覺(jué)系統(tǒng)本身就變成了個(gè)“內(nèi)存大盜”了。</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="[藍(lán)森林-自由軟件] - 請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.files/icon_new.gif"
width=29
border=0><B>請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.</B><BR><BR>kernelxu
你申請(qǐng)的內(nèi)存全部都沒(méi)有free :P
<BR><BR>現(xiàn)實(shí)中應(yīng)該沒(méi)有樓主頭腦中想象的這種用法吧<BR>要是k=malloc(100),k+=20,然后free(k)?沒(méi)這種搞法吧,有么?<BR><BR>我覺(jué)得樓主是多慮了</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="[藍(lán)森林-自由軟件] - 請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.files/icon_new.gif"
width=29 border=0><B>請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.</B><BR><BR><!--<!--[quote][i]原帖由 "luojiannx" 發(fā)表:[/i]<br />kernelxu 你申請(qǐng)的內(nèi)存全部都沒(méi)有free :P <br />
<br />
現(xiàn)實(shí)中應(yīng)該沒(méi)有樓主頭腦中想象的這種用法吧<br />
要是k=malloc(100),k+=20,然后free(k)?沒(méi)這種搞法吧,有么?<br />
<br />
我覺(jué)得樓主是多慮了[/quote]-->--><BR>呵呵,謝謝luojiannx提醒!
:em02: :em02: <BR><BR><!--<!--[quote]現(xiàn)實(shí)中應(yīng)該沒(méi)有樓主頭腦中想象的這種用法吧 <br />
要是k=malloc(100),k+=20,然后free(k)?沒(méi)這種搞法吧,有么?[/quote]-->--><BR>如果真有人這么搞(比如說(shuō)我現(xiàn)在就在我的程序里直接使用free(k)),那么調(diào)用free(k)應(yīng)該是釋放后80個(gè)字節(jié)嗎?<BR>呵呵,還真沒(méi)注意。</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="[藍(lán)森林-自由軟件] - 請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.files/icon_new.gif"
width=29
border=0><B>請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.</B><BR><BR>有人來(lái)指點(diǎn)一下嗎,我想知道我說(shuō)得對(duì)不?</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">請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.</a><br><br></td></tr></table>-->
<SCRIPT language=JavaScript1.1
src="[藍(lán)森林-自由軟件] - 請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.files/336280.js"></SCRIPT>
<DIV class=mid align=right>[ <A
href="javascript:shutwin();">關(guān)閉窗口</A> ]</DIV><BR>
<CENTER>
<SCRIPT language=JavaScript1.1
src="[藍(lán)森林-自由軟件] - 請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.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> 藍(lán)森林網(wǎng)站 版權(quán)所有。</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="[藍(lán)森林-自由軟件] - 請(qǐng)教各位一個(gè)復(fù)雜的結(jié)構(gòu)體指針問(wèn)題.files/counter.js"></SCRIPT>
</TD></TR></TBODY></TABLE>
<CENTER></CENTER></TR></TBODY></TABLE></BASEFONT></BODY></HTML>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -