簡體   English   中英

此代碼可在Turbo C上運行,但不能在gcc編譯器上運行?

[英]This code run on Turbo C but not on gcc compiler?

此代碼在Turbo C上運行,但不在gcc編譯器上運行
錯誤:“ *”令牌之前的語法錯誤

#include<stdio.h>
int main()
{
char huge *near *far *ptr1;
char near *far *huge *ptr2;
char far *huge *near *ptr3;
printf("%d, %d, %d\n", sizeof(ptr1), sizeof(ptr2), sizeof(ptr3));
return 0;
}

Turbo C輸出為:4、4、2
您能解釋一下Turbo C上的輸出嗎?

預選賽hugefarnear ,是非標准 因此,盡管它們可能在Turbo C中工作,但是您不能依靠它們在其他編譯器(例如gcc)中工作。

Borland的DOS C / C ++編譯器支持多種內存模型。

內存模型是通過指針訪問代碼和數據的一種方式。

由於DOS在所謂的CPU real mode運行,在該real mode ,通過segment valueoffset value (通常通常為16位長)對訪問內存,因此內存地址自然為4個字節長。

但是段值不必總是明確指定。 如果程序需要訪問的所有內容都包含在一個segment (在16字節邊界上對齊的64KB內存塊),則單個段值就足夠了,並且一旦將其加載到CPU的段寄存器(CS,SS,DS,ES中) ),則該程序只能使用16位偏移量來訪問所有內容。 順便說一句,許多.COM類型的程序完全像這樣工作,它們只使用一個段。

因此,您有2種可能的方式來訪問內存,無論有沒有明確的段值。

在這些行中:

char huge *near *far *ptr1;
char near *far *huge *ptr2;
char far *huge *near *ptr3;

修飾符farhugenear指定了ptr1ptr2ptr3將指向的對象的鄰近度。 它們告訴編譯器*ptr1*ptr2對象將與程序的主/當前段“相距較遠”,也就是說,它們將位於其他某些段中,因此需要通過4字節進行訪問指針, *ptr3對象位於程序自己的段中,位於“ near”附近,並且2字節的指針就足夠了。

這說明了不同的指針大小。

取決於為程序選擇的內存模型,函數和數據指針將默認為nearfarhuge並且可以避免明確地將它們拼出,除非您需要非默認指針。

程序存儲器模型為:

  • 微小的:所有事物都有1段; 靠近指針
  • 小:1個代碼段,1個數據/堆棧段; 靠近指針
  • 中:多個代碼段,1個數據/堆棧段; 遠代碼指針,近數據指針
  • 緊湊:1個代碼段,多個數據段; 近代碼指針,遠數據指針
  • 大:多個代碼和數據段; 遠指針
  • 巨大:多個代碼和數據段; 巨大的指針

Huge指針沒有far指針的某些限制,但操作起來較慢。

您忘了在變量之間加逗號:)。 如果變量的作用域相同,則它們不能具有相同的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM