簡體   English   中英

在 C 中傳遞指向 arrays 的指針的正確方法是什么?

[英]What is the proper way of passing pointers to arrays in C?

以這段代碼為例:

#include <stdio.h>
void print_array(size_t size, unsigned (*myarray)[])
{
    printf("Array size: %lu\n", size);
    for (size_t i = 0; i < size; ++i)
            printf("%u ", (*myarray)[i]);
    printf("\n");
}
int main() {
    unsigned myarray[] = { 9, 8, 7, 6, 5 };
    print_array(sizeof(myarray) / sizeof(unsigned), &myarray);
    return 0;
}

使用 clang 分析器(通過 gcc 10.1.0)編譯時,警告為:

src/main.c:7:3: warning: 2nd function call argument is an uninitialized value
            printf("%u ", (*myarray)[i]);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

output 是:

Array size: 5
9 8 7 6 5 

這段代碼有什么錯誤,在 C 中傳遞指向 arrays 的指針的正確方法是什么?

您可以簡單地傳遞一個指針並使用數組變量表示其第一個元素開始的地址這一事實。 似乎對 clang 使用迂腐,對 function 參數可能指向什么做了很多假設,所以它抱怨。

void print_array(size_t size, const unsigned *myarray)
{
    printf("Array size: %lu\n", size);
    for (size_t i = 0; i < size; ++i)
            printf("%u ", myarray[i]);
    printf("\n");
}

int main() {
    unsigned myarray[] = { 9, 8, 7, 6, 5 };
    print_array(sizeof(myarray) / sizeof(unsigned), myarray);
    return 0;
}

這似乎是一個誤報。 代碼沒有問題 - 雖然風格有點異國情調,但都是有效的 C。

如果評論是關於實際缺少初始化,則可能與工具未檢查調用者有關。 但是即使分析器只考慮本地翻譯單元,它也不能 go 關閉並假設傳遞的變量默認未初始化。 那將是一個非常奇怪的假設。

也許分析器被嚇到了,您實際上是在將unsigned (*myarray)[5]傳遞給 function 並期望unsigned (*myarray)[] (指向不完整類型的指針,未指定大小的數組)。 您可以嘗試將參數更改為unsigned (*myarray)[size])並查看它是否使工具更快樂。

編輯:雖然數組指針類型是兼容的,所以該工具也不應該因為這個原因而抱怨。 根據 C17 6.7.6.2/6,一種或兩種數組類型可以省略大小說明符並且仍然兼容:

對於要兼容的兩個數組類型,兩者都應具有兼容的元素類型,並且如果兩個大小說明符都存在,並且是 integer 常量表達式,則兩個大小說明符應具有相同的常量值。

暫無
暫無

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

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