簡體   English   中英

如何返回帶有數組的C結構?

[英]How are C structs with arrays returned?

假設我們有:

typedef struct {
    uint8_t someVal;
} Entry

typedef struct {
    Entry grid[3][3];
} Matrix

//Make a 3x3 matrix of all 0s
Matrix emptyMatrix(void) {
    Entry zero = {.value = 0}
    Matrix matrix;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++) {
            //Shallow copy empty struct
            matrix.grid[i][j] = zero;
        }
    return matrix;
}

Matrix myMatrix = emptyMatrix();

我理解在C中我們可以從函數返回一個結構 ,所以這個工作,我測試了它。 但是,我不清楚作業如何工作。

編譯器是否為myMatrix分配內存,然后復制emptyMatrix()返回的Matrix結構中數組的每個Entry元素?

我想知道Matrix的內存映射也會有所幫助 - 我假設因為grid是一個Matrix的內存包含指針的數組。 但是,它顯然存儲了價值 如果是這種情況,我對作業如何運作的猜測對我來說更有意義。

編輯:似乎人們沒有完全回答這個問題。 我想知道我對分配工作原理的猜測是否正確。

Matrix每個實例都包含一個3x3的Entry 數組 將一個Matrix實例分配給另一個實例時,源矩陣的內容將被復制到目標矩陣。

數組不是指針。 如果表達式不是sizeof或一元&運算符的操作數,或者不是用於初始化聲明中的字符數組的字符串文字,則數組表達式將“衰減”為指針。

例如,如果你有一個函數調用

printMatrix( myMatrix.grid );

表達 myMatrix.grid具有類型“的3元素數組的3元素數組Entry ”; 因為它不是的操作數sizeof或一元&運算符,它“衰變”到類型的“指針的3元素數組表達Entry ”( Entry (*)[3]和表達式的值是地址grid的第一個元素(也將是整個Matrix實例的地址)。

每個環境的ABI定義了如何通過值傳遞和返回結構。 一個常見的選擇是:

  • 寄存器中返回最小為2或4個寄存器的小結構。

  • 對於較大的對象,調用者在其堆棧幀上為返回值分配空間,並將指針傳遞給該函數。 返回時,該函數會將返回的任何對象復制到它收到返回值指針的空間中。 而已。 這種簡單的方法允許遞歸調用。

  • 優化器嘗試最小化復制量,特別是如果它可以內聯函數或者返回值存儲到對象中,而不是丟棄或通過值傳遞給另一個函數。

如果結構具有一個或多個成員數組,則無關緊要。 同樣的方法也適用於工會。

綁定到數組的標識符可能會被解釋為指針,但這並不意味着數組變量是指針。

數組的存儲是結構本身的內存布局的一部分。 與堆棧上聲明的數組相同的方式是堆棧本身。

您可以通過檢查sizeof(Matrix)

簡而言之:

編譯器是否為myMatrix分配內存,然后復制emptyMatrix()返回的Matrix結構中數組的每個Entry元素?

Matrix是一種數據類型struct struct {Entry grid[3][3];} 對於尺寸為Entry grid[3][3] Metrix存儲器類型的每個對象將被分配。
函數emptyMatrix返回一個Matrix類型的對象,該對象將像任何其他對象一樣按值返回。

暫無
暫無

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

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