[英]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()
的類型為char
而sizeof( 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.