簡體   English   中英

sizeof C中的函數類型

[英]sizeof a function types in C

我有一些關於sizeof運算符的情況,它與函數類型一起使用。

案例1[現場演示]

#include <stdio.h>

char func()
{
    printf("sizeof func = %zu\n", sizeof(func())); //Ok. Output : 1
    return 0;
}

int main(void)
{
    func();
}

sizeof(func())在C中有效嗎?

案例2: [現場演示]

printf("sizeof func = %zu\n", sizeof(&func())); // error

它不起作用。 編譯器給出錯誤。 為什么?

案例3: [現場演示]

printf("sizeof func = %zu\n", sizeof(&func)); //Ok. Output : 8

這里, sizeof(&func)等於指針的大小?

這里, 案例3工作正常,其中案例2給出錯誤。 為什么?

sizeof的操作數可以有兩種形式:

  • 一個paranthesized 類型名稱 ,例如(char)(int)(struct mystruct) ,...結果是命名類型的存儲大小。

  • 一種表達。 結果是表達式評估的類型的存儲大小(但不進行評估)。

您的示例都不是類型名稱 函數的類型名稱char (void) 所以你所有的parantheses都是多余的。

在第一個示例中,您有sizeof func() 評估func()將返回一個char ,因此結果為1

在第三個示例中,您有sizeof &func 評估&func將為您提供一個函數指針,並且您的計算機上的函數指針的大小為8

第二個例子是錯誤的, &func()不是一個有效的表達式。 您不能指向函數調用。 在標准術語中, func()不是左值 ,它是應用&所必需的。

sizeof(type)返回sizeof(type)的對象表示的字節大小。

sizeof(expr)返回sizeof(expr)返回的類型的對象表示的字節大小(如果已計算)。

情況1

func是一個返回char類型值的函數。 因此sizeof(func())sizeof(char)相同,即1

案例2

&func()不是有效的表達式(您試圖獲取函數的返回值的地址,這是未定義的)

案例3

&func返回函數func的地址,這是一個指針。 在64位系統上, sizeof(&func)將是指針的大小,即8 它在32位操作系統上為4

在這個聲明中

printf("sizeof func = %zu\n", sizeof(func())); 

輸出表達式的大小(未評估) func() 由於函數的返回類型是char因此表達式func()的類型為charsizeof( char )等於1。

來自C標准(6.5.3.4 sizeof和alignof運算符)

4當sizeof應用於具有char,unsigned char或signed char(或其合格版本)類型的操作數時,結果為1 ....

在這個聲明中

printf("sizeof func = %zu\n", sizeof(&func())); 

存在對一元運算符應用的嘗試&到被評價為表達的臨時對象func() 您可能無法將操作符應用於臨時對象。

從C標准(6.5.3.2地址和間接運算符)

1 一元&運算符的操作數應該是函數指示符,[]或一元*運算符的結果,或者是一個左值 ,它指定一個不是位字段的對象,並且不用寄存器存儲類聲明符。

為了比較,請考慮以下程序

#include <stdio.h>

char * func()
{
    static char i = 0;

    printf("sizeof func = %zu\n", sizeof(&*func()));

    return &i;
}

int main(void)
{
    func();
}

在該程序中,該函數返回具有靜態存儲持續時間的左值i指針。 因此,應用一元運算符*您將獲得左值。 因此,您可以應用運算符&在這種情況下。

程序輸出將是

sizeof func = 8

在這個聲明中

printf("sizeof func = %zu\n", sizeof(&func)); 

char ( * )( void )類型的函數指針計算運算符sizeof。 再次根據C標准的引用,運算符&可以應用於函數指示符。

考慮到函數定義應該是這樣的

char func( void )
           ^^^^ 
{
    printf("sizeof func = %zu\n", sizeof(func())); //Ok. Output : 1
    return 0;
}

暫無
暫無

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

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