3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
> type ppp.c
#include <stdio.h>
#include <stdlib.h>
int global = 0;
int main(void) {
int local = 0;
static int staticint = 0;
int *mall;
int (*fx)(void);
fx = main;
mall = malloc(42); /* assume it worked */
printf("#sizeof pointer to local: %d\n", (int)sizeof &local);
printf("#sizeof pointer to static: %d\n", (int)sizeof &staticint);
printf("#sizeof pointer to malloc'd: %d\n", (int)sizeof mall);
printf("#sizeof pointer to global: %d\n", (int)sizeof &global);
printf("#sizeof pointer to main(): %d\n", (int)sizeof fx);
free(mall);
return 0;
}
> tcc -mc ppp.c
Turbo C Version 2.01 ...
warnings about unused variables elided ...
Turbo Link Version 2.0 ...
> ppp
#sizeof pointer to local: 4
#sizeof pointer to static: 4
#sizeof pointer to malloc'd: 4
#sizeof pointer to global: 4
#sizeof pointer to main(): 2
> tcc -mm ppp.c
> ppp
#sizeof pointer to local: 2
#sizeof pointer to static: 2
#sizeof pointer to malloc'd: 2
#sizeof pointer to global: 2
#sizeof pointer to main(): 4
tcc -mc在“緊湊”模型中生成代碼;tcc -mm在“中”模型中生成代碼

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
在實(shí)模式x86上,按段+偏移量訪問(wèn)代碼和數(shù)據(jù),每段16位?!敖敝羔槂H為16位,并使用當(dāng)前段,“遠(yuǎn)”指針為32位,并指定段和偏移量。對(duì)于C編譯器,您可以選擇幾種不同的內(nèi)存模型,其中代碼和數(shù)據(jù)的近或遠(yuǎn)指針具有不同的默認(rèn)值。
例如,默認(rèn)情況下,“中”內(nèi)存模型使用近指針存儲(chǔ)數(shù)據(jù),而遠(yuǎn)指針存儲(chǔ)代碼。
如果某些現(xiàn)代嵌入式處理器具有類似的內(nèi)存模型,我不會(huì)感到驚訝。

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
請(qǐng)注意,POSIX要求指向?qū)ο蟮闹羔樅椭赶蚝瘮?shù)的指針具有相同的大?。?/p>
2.12.3指針類型
所有功能指針類型均應(yīng)與void的類型指針具有相同的表示形式。將函數(shù)指針轉(zhuǎn)換為void *不會(huì)改變表示形式??梢允褂蔑@式強(qiáng)制轉(zhuǎn)換將此類轉(zhuǎn)換產(chǎn)生的void *值轉(zhuǎn)換回原始函數(shù)指針類型,而不會(huì)丟失信息。
注意:ISO C標(biāo)準(zhǔn)不需要這樣做,但是為了符合POSIX要求,它是必需的。
因此,要求POSIX兼容性的系統(tǒng)將是統(tǒng)一的。如果您僅針對(duì)此類機(jī)器,則不必?fù)?dān)心差異。
- 3 回答
- 0 關(guān)注
- 554 瀏覽
添加回答
舉報(bào)