亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 2124 | 回復(fù): 4
打印 上一主題 下一主題

[C] 關(guān)于 realloc [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-11-04 01:41 |只看該作者 |倒序?yàn)g覽
本帖最后由 hbmhalley 于 2012-11-04 01:43 編輯

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>

  4. int main () {
  5.         char *a = malloc (1) ;
  6.         char *b = malloc (1) ;
  7.         b[0] = 'b' ; ///////////////////////////////////////
  8.         assert (realloc (a , 0x11) != NULL) ;
  9.         a[0x10] = 'a' ;
  10.         printf ("%p\n%p\n" , a+0x10 , b) ;
  11.         printf ("%c\n" , b[0]) ; ////////////////////////////////
  12.         return 0 ;
  13. }
復(fù)制代碼
result:

  1. 0x80010208
  2. 0x80010208
  3. a
復(fù)制代碼
gcc 4.5.3

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
2 [報(bào)告]
發(fā)表于 2012-11-04 02:03 |只看該作者
斷言里不要放帶副作用的表達(dá)式。

realloc以后, 傳遞給它的參數(shù)就失效了(相當(dāng)于被free),之后真正有效的是realloc返回的那個(gè)指針(即你在assert里面扔掉的那個(gè)指針),如果realloc失敗,將返回NULL,則原來的指針不動(dòng)。

realloc新大小0,相當(dāng)于free原來的指針。realloc一個(gè)NULL指針,相當(dāng)于malloc。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-11-04 02:10 |只看該作者
回復(fù) 2# starwing83


    問題在于 realloc 成功 (!=NULL) 可能導(dǎo)致其他不相干的 malloc 過的空間受污染.

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
4 [報(bào)告]
發(fā)表于 2012-11-04 02:15 |只看該作者
回復(fù) 3# hbmhalley


    ……………………你沒救了。

a被分配了一塊16字節(jié)的內(nèi)存。你realloc到17,a就不夠用了。

于是realloc重新找系統(tǒng)要了一塊17字節(jié)的內(nèi)存,將1字節(jié)的a拷貝過去,然后free掉了a原先的內(nèi)存,然后將新分配的17字節(jié)內(nèi)存返回給你了。

但是你把realloc新分配的內(nèi)存給扔了(通過比較)
這時(shí)a沒被更新,而且a已經(jīng)是野指針了,a[0x10] = 'a'的行為是未定義的。

正確的代碼是這樣的:

char *a = malloc(1);
char *b = malloc(1);
char *new_a;
*a = 'a';
*b = 'b';
new_a = realloc(a, 0x11);
assert(new_a != NULL);
a = new_a;
a[0x10] = 'a';
assert(b[0] == 'b');
free(a);
free(b);

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-11-04 02:17 |只看該作者
回復(fù) 4# starwing83


    soga!
    大半夜的不大精神 ..

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP