首頁>Program>source

在C中,我需要知道結構的大小,该結構中包含函式指標.我可以保證在所有平臺和體系結構上都能做到這一點吗?

  • the size of a void* is the same size as a function pointer?
  • the size of the function pointer does not differ due to its return type?
  • the size of the function pointer does not differ due to its parameter types?

我认為所有這些答案都是肯定的,但我想確定.對於上下文,我打電话给 sizeof(struct mystruct)

最新回復
  • 5月前
    1 #

    根据C99規範,第6.2.5节,第27段:

    A pointer to void shall have the same representation and alignment requirements as a pointer to a character type. Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements. All pointers to structure types shall have the same representation and alignment requirements as each other. All pointers to union types shall have the same representation and alignment requirements as each other. Pointers to other types need not have the same representation or alignment requirements.

    所以没有; 不能保證 可以容纳一个函式指標。

    第6.3.2.3节第8段:

    void *

    暗示一種功能指標型別可以儲存任何其他功能指標值.从技術上讲,這不等於保證函式指標型別的大小不能變化,只是保證它们的值彼此之間處於相同範圍。

  • 5月前
    2 #

    不,不,不。

    C不赞成使用具有不同代碼和資料指標大小的哈佛體系結構,因為理想情况下,在為這種體系結構进行程式設計時,您希望將資料儲存在程式儲存器中(字元串文字等),並執行所需的操作 物件指標进入代碼空間.但這並不禁止它们,因此就標準而言,函式指標可以指向与資料地址空間大小不同的地址空間。

    但是,任何函式指標都可以強製轉換為另一種函式指標型別[*],而不会浪费值,就像將任何物件指標強製轉換為

    A pointer to a function of one type may be converted to a pointer to a function of another type and back again; the result shall compare equal to the original pointer.

    一樣 然後迴来.因此,使函式指標的大小根据其簽名而變化將非常令人惊讶.如果您必须能够以某種方式在较小的空間中儲存相同的值,然後在迴退時將其檢索,則多餘的空間没有明顯的"用途"。

    [*]谢谢,schot。

  • 5月前
    3 #

    除了其他答案,維基百科還說:

    http://en.wikipedia.org/wiki/Function_pointer

    void*

    Although function pointers in C and C++ can be implemented as simple addresses, so that typically ,成員 C ++中的指標经常被實現 作為"胖指標",通常是两个或 簡單的三倍 函式指標,以便處理 虛擬繼承。

    函式指標是一个抽象.只要满足標準要求,一切皆有可能.即 如果程式中的函式少於256个,則可以通過使用值為0的NULL和值為1至255的單个位元組作為具有物理地址的表的索引来實現函式指標.如果您超過255个函式,則可以擴充套件為使用2个位元組。

  • 5月前
    4 #

    有一个實際的例子,大小不同,這是常见的.在MS-DOS和早期的windows C程式設計中,在"中"記憶體模型中,您有16位資料指標,但有32位函式指標,而"紧凑"記憶體模型則相反。

    sizeof(Fx)==sizeof(void *)

  • javascript:Angularjs在請求的資源上不存在" Access-Control-Allow-Origin"標頭因此不允许訪問原始"空"
  • c#:屬性引數必须是一个常量表達式,…-建立型別為array的屬性