为什么这个赋值不能在函数之外工作?

时间:2016-11-12 07:08:09

标签: c struct initialization variable-assignment

以下是我发生的事情的一个例子。第一段代码不起作用。

typedef struct {
    char *desc;
    unsigned quantity;
} item;

item *inventory[INVENTORY_SIZE];

item thing = { "This is a thing.", 2 };
inventory[0] = &thing;  // Fail.

int main(void){
    // Code goes here.
}

但是,以下代码可以使用。

typedef struct {
    char *desc;
    unsigned quantity;
} item;

item *inventory[INVENTORY_SIZE];

item thing = { "This is a thing.", 2 };

int main(void){
    inventory[0] = &thing;  // Works.
}

我知道我不能在函数之外调用函数,但我可以在函数之外分配全局变量。这看起来像是一项任务。那么为什么它不起作用?

编辑:一旦我点击'发布',我想我意识到了答案。您可以在函数外部的声明中指定值,但前提是它只是声明。这就是答案,不是吗?

5 个答案:

答案 0 :(得分:6)

当我们写:

data_type variableName = someValue;

这意味着我们首先将 variableName 声明为变量,并且 data_type 类型。随后,正在进行值的赋值,之后立即由于这是分配给 variableName 的第一个值,它还将其初始化为 someValue

允许哪个。这是一种特殊类型的函数,即系统函数,称为初始化。

但写作

variableName = someValue;

表示我们正在尝试将 someValue 分配给任何函数范围之外的 variableName ,并且不在初始化范围内。

在功能之外是不可能的。

代码仅在被调用的函数内执行,初始化除外,它在初始赋值期间发生。

答案 1 :(得分:2)

这应该有用,如果它是你想要完成的事情:

item thing = { "This is a thing.", 2 };
item *inventory[INVENTORY_SIZE] = {&thing};

这些是definitions(因为它们位于顶级范围内),因此编译器将继续为此翻译单元分配存储空间。

答案 2 :(得分:1)

item thing = { "This is a thing.", 2 };
尽管看起来像什么,但

并不是一项任务。它实际上是初始化(声明的一部分),它在函数之外完全有效。

另一方面,

inventory[0] = &thing;

一个必须在某个描述函数内的赋值。

最重要的是,您不应将初始化规则应用于分配。

答案 3 :(得分:0)

首先,

item thing = { "This is a thing.", 2 }

initialization,这是一种特殊情况,而不是作业。这将设置变量的初始值。初始化与声明绑定,因此它可以驻留在文件范围内。

assignment expression只能驻留在函数内。换句话说,一个赋值需要在运行时执行,所以如果它不在函数范围内,就无法知道何时来执行它。

答案 4 :(得分:0)

你猜对了:第二个例子是初始化,而不是执行语句。它是合法的,因为全局变量是在程序执行之前创建的(即,对main函数的初始调用)。可以这样想:命令流从main函数开始,它进入所有从它调用的函数,因为它们在程序代码中被调用。所以在任何时候程序都在某个函数中,并且任何不属于某个函数的命令(除了预先完成的初始化之外)都是自动死代码 - 程序无法访问它们。