Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么';这项任务不在职能范围内工作吗?_C_Struct_Initialization_Variable Assignment - Fatal编程技术网

C 为什么';这项任务不在职能范围内工作吗?

C 为什么';这项任务不在职能范围内工作吗?,c,struct,initialization,variable-assignment,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 };
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.
}
我知道我不能在函数外调用函数,但我可以在函数外分配全局变量。这看起来像是一项任务。那么为什么它不起作用呢

编辑:我一点击“帖子”,我想我就意识到了答案。您可以在函数外部的声明中赋值,但仅当它是一个声明时。这就是答案,不是吗

item thing = { "This is a thing.", 2 };
不管它看起来像什么,它都不是一项任务。它实际上是一个初始化(声明的一部分),在函数之外完全有效

另一方面,

inventory[0] = &thing;
是一个赋值,它必须位于某个描述的函数中

总之,您不应该将初始化规则应用于作业

不管它看起来像什么,它都不是一项任务。它实际上是一个初始化(声明的一部分),在函数之外完全有效

另一方面,

inventory[0] = &thing;
是一个赋值,它必须位于某个描述的函数中

总之,你不应该对作业应用初始化规则。

首先

item thing = { "This is a thing.", 2 }
是一个,这是一个特例,不是一个任务。这将设置变量的初始值。初始化与声明绑定在一起,因此它可以驻留在文件范围内

只能驻留在函数内部。简单地说,赋值需要在运行时执行,因此如果它不在函数范围内,就无法知道何时执行它。

首先

item thing = { "This is a thing.", 2 }
是一个,这是一个特例,不是一个任务。这将设置变量的初始值。初始化与声明绑定在一起,因此它可以驻留在文件范围内


只能驻留在函数内部。简单地说,赋值需要在运行时执行,因此如果赋值不在函数范围内,就无法知道何时执行它。

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

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

如果您想要完成的是:

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

它们是(因为它们在顶级作用域中),因此编译器将继续在这个翻译单元中为它们分配存储。

如果您想要完成的是:

item thing = { "This is a thing.", 2 };
item *inventory[INVENTORY_SIZE] = {&thing};
它们是(因为它们在顶级范围内),因此编译器将继续在这个翻译单元中为它们分配存储。

当我们编写:

data_type variableName = someValue;
这意味着我们首先将variableName声明为变量,类型为data\u type。随后,一个值的赋值被立即完成,因为这是第一个赋值给variableName,它也将其初始化为someValue

这是允许的。这是一种特殊类型的功能,即系统功能,称为初始化

但是写作

variableName = someValue;
意味着我们试图将someValue分配给variableName任何函数的范围之外,以及初始化的范围之外

这在函数之外是不可能的

代码仅从调用的函数内部执行,初始化除外,初始化发生在初始赋值过程中。

当我们编写:

data_type variableName = someValue;
这意味着我们首先将variableName声明为变量,类型为data\u type。随后,一个值的赋值被立即完成,因为这是第一个赋值给variableName,它也将其初始化为someValue

这是允许的。这是一种特殊类型的功能,即系统功能,称为初始化

但是写作

variableName = someValue;
意味着我们试图将someValue分配给variableName任何函数的范围之外,以及初始化的范围之外

这在函数之外是不可能的


代码仅从调用的函数内部执行,初始化除外,初始化发生在初始赋值过程中。

我认为您误解了赋值和初始化之间的区别。你的是前者。只有在你正在做你正在做的事情的地方,它才可能是后者。你可以做你想做的事情,但只是作为初始化,这需要重新排列一些代码并为指针数组提供一个初始化序列。重新编辑(并与我的答案一起阅读),你不需要“在函数之外的声明中赋值”,而是初始化对象