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

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

Chinaunix

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

[C] 成員地址反推結(jié)構(gòu)地址? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-08-28 12:11 |只看該作者 |倒序?yàn)g覽
今天看書(shū)看到一個(gè)宏定義
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
可以有結(jié)構(gòu)成員的地址反推得到結(jié)構(gòu)的地址,這個(gè)定義倒是能看懂,但是有個(gè)小小的疑惑,如果結(jié)構(gòu)體由低地址往高地址存儲(chǔ)沒(méi)有問(wèn)題,但是如果反過(guò)來(lái)呢,好像就不太對(duì)了,不知道理解的對(duì)不對(duì),還是另有玄機(jī),希望知情的大大能指點(diǎn)下~

ps:member是結(jié)構(gòu)成員,ptr是指向member的指針,type是含有member的結(jié)構(gòu)體

[ 本帖最后由 empty141 于 2009-8-28 12:13 編輯 ]

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
2 [報(bào)告]
發(fā)表于 2009-08-28 12:48 |只看該作者

回復(fù) #1 empty141 的帖子

原帖由 empty141 于 2009-8-28 12:11 發(fā)表
如果結(jié)構(gòu)體由低地址往高地址存儲(chǔ)沒(méi)有問(wèn)題,但是如果反過(guò)來(lái)呢


這個(gè)沒(méi)關(guān)系的。

舉個(gè)endian的例子:

unsigned u = 0x1;
u <<= 1;

無(wú)論在little 還是big,都可以認(rèn)為:
assert( u==0x2 );


假設(shè)unsigned是4字節(jié):
unsigned u = 0x1;

0x00, 0x00, 0x00, 0x01 : big
0x01, 0x00, 0x00, 0x00 : little

但是:
u <<= 1, 在big上是左移:
0x00, 0x00, 0x01, 0x00 : big

在little上, 其實(shí)是移:
0x00, 0x01, 0x00, 0x00 : big


在C程序員角度, 只要認(rèn)為對(duì)unsigned 左移是增加, 右移是減少就可以了。
編譯器知道目標(biāo)代碼的endian, 會(huì)做相應(yīng)的處理。


對(duì)offset也是如此。
從程序員角度看, C中的struct和C++中的POD, 先聲明的fields,地址較低。
無(wú)論編譯器怎么排放, 它會(huì)處理好這個(gè)事情。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
3 [報(bào)告]
發(fā)表于 2009-08-28 12:50 |只看該作者

回復(fù) #1 empty141 的帖子

原帖由 empty141 于 2009-8-28 12:11 發(fā)表
如果結(jié)構(gòu)體由低地址往高地址存儲(chǔ)沒(méi)有問(wèn)題,但是如果反過(guò)來(lái)呢


并且, 有反過(guò)來(lái)的平臺(tái)么

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-08-28 13:18 |只看該作者
原帖由 OwnWaterloo 于 2009-8-28 12:50 發(fā)表


并且, 有反過(guò)來(lái)的平臺(tái)么

哦,呵呵,我也不知道,只是在看到這個(gè)宏定義的時(shí)候突然想到這個(gè)問(wèn)題
如果是在棧中的結(jié)構(gòu)體有沒(méi)有可能是由高往低的呢

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-08-28 13:24 |只看該作者
C的結(jié)構(gòu)都是從低地址放置前面的元素。
沒(méi)有反過(guò)來(lái)的。
ENDIAN不影響這個(gè)順序(僅僅影響位結(jié)構(gòu))
而位結(jié)構(gòu)的項(xiàng)取地址無(wú)意義。

[ 本帖最后由 思一克 于 2009-8-28 13:26 編輯 ]

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-08-28 13:41 |只看該作者
哦,呵呵,這樣子的,謝謝版主和OwnWaterloo啦
您需要登錄后才可以回帖 登錄 | 注冊(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)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP