繁体   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