簡體   English   中英

為什么此sizeof運算符給出錯誤?

[英]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 )*10sizeof(*a)/sizeof(int); 將給出a的元素計數,在這種情況下為10。

由於您要傳遞指向大小為3的數組的指針,因此應使用3而不是10。可以使用正向參數來具有大小可變的參數a

標准說:

C11:6.5.3.4

sizeof運算符不得應用於具有函數類型或不完整類型 [..]的表達式

未知大小的數組類型是不完整的類型 (C11:6.2.5類型--p22)。 *a func中的*a是不完整的類型。 您需要先指定a指向數組的長度,然后再將其用作sizeof的操作數。

暫無
暫無

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

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