2

在第 6 章的开头:Brian W. Kernighan 和 Dennis M. Ritchie 的书的结构,有一段我看不懂。

ANSI 标准所做的主要更改是定义结构分配 - 结构可以被复制和分配,传递给函数,并由函数返回。大多数编译器多年来一直支持这一点,但现在已经精确定义了这些属性。现在也可以初始化自动结构和数组。

现在也可以初始化自动结构和数组是什么意思?我很确定应该手动初始化自动的,即局部变量。你能帮我理解它的意思吗?

4

2 回答 2

9

在准标准 C 中(意思是“在 C89 标准之前”,或者很久以前),你不能这样写:

int function(int i)
{
    int array[4]                 = { 1, 2, 3, 4 };
    struct { int x; int y; } x   = { 1, 2 };
    struct { int x; int y; } a[] = { { 2, 3 }, { 3, 4 } };
    ...code using array, x, a...
    return x.y + a[!!i].x + array[3];
}

现在你可以做所有这些了。

此外,在 K&R 第 1 版 C(大约 1978 年)中,不允许您编写:

int another()
{
     struct { int x; int y; } a, b;
     a.x = 1;
     a.y = 0;
     b = a;  /* Not allowed in K&R 1 */
     some_other_func(a, b);    /* Not allowed in K&R 1 */
     some_other_func(&a, &b);  /* Necessary in K&R 1 */
     ...
}

您也可以只返回指向结构的指针(以及传递指向结构的指针)。IIRC,一些 C 编译器实际上允许使用非指针表示法,但将幕后的代码转换为使用指针。然而,在标准发布之前(在 K&R 1 发布后不久),结构分配、结构传递和结构返回限制已从 C 中删除。但并非所有编译器都支持这些功能,因为没有标准让它们符合。

于 2013-07-07T16:10:48.430 回答
3

这意味着您可以执行以下操作:

typedef struct { int a; float b; } foo;

int main(void) {
    foo f = { 42, 3.14 };  // Initialization

    ...
}
于 2013-07-07T16:01:55.230 回答