[英]Why is this sizeof operator giving error?
在此程序中,行int len = sizeof(*a)/sizeof(int);
給出錯誤,但是如果我寫這個int len = sizeof(**a)/sizeof(int);
或int len = sizeof(a)/sizeof(int);
,效果很好。 這是為什么? 這里a
保存一維數組的地址,當我執行此操作時, *a
給出數組第一個元素的地址,最后**a
給出元素本身。 因此,基於此行int len = sizeof(*a)/sizeof(int);
應該工作正常,不是嗎?
#include <stdio.h>
void func(int (*a)[]){
printf("%d %d\n", sizeof(a), sizeof(int));
int len = sizeof(*a)/sizeof(int); // error
for(int i = 0; i < len; ++i){
printf("%d ", (*a)[i]);
}
}
int main(){
int a[][3] = {
{1, 2, 3},
{4, 5, 6}
};
func(a);
return 0;
}
參數a是指向不完整類型的指針。 您不能在其上使用sizeof,因為它是指向數組的指針,並且未定義數組的大小。
您可以定義它:
void func(int (*a)[10]){
在這種情況下, sizeof(*a)
等於sizeof( int )*10
和sizeof(*a)/sizeof(int);
將給出a的元素計數,在這種情況下為10。
由於您要傳遞指向大小為3的數組的指針,因此應使用3而不是10。可以使用正向參數來具有大小可變的參數a
。
標准說:
sizeof
運算符不得應用於具有函數類型或不完整類型 [..]的表達式
未知大小的數組類型是不完整的類型 (C11:6.2.5類型--p22)。 *a
func
中的*a
是不完整的類型。 您需要先指定a
指向數組的長度,然后再將其用作sizeof
的操作數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.