以下是我发生的事情的一个例子。第一段代码不起作用。
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.
}
我知道我不能在函数之外调用函数,但我可以在函数之外分配全局变量。这看起来像是一项任务。那么为什么它不起作用?
编辑:一旦我点击'发布',我想我意识到了答案。您可以在函数外部的声明中指定值,但前提是它只是声明。这就是答案,不是吗?答案 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
函数开始,它进入所有从它调用的函数,因为它们在程序代码中被调用。所以在任何时候程序都在某个函数中,并且任何不属于某个函数的命令(除了预先完成的初始化之外)都是自动死代码 - 程序无法访问它们。