Tag: 全局变量

全局变量如$ _GLOBAL,$ _POST等存储在哪里?

当我参加面试时,面试官问我这个问题。 他们正在使用堆,堆栈等内存。我用Google搜索但我没有得到任何明确的答案。

一个function内的“extern”?

那么,阅读“有点旧”的书(“C编程语言”,第二版,丹尼斯·里奇),我得到了以下几点: 外部变量必须在任何函数之外定义一次; 这为它留出了存储空间。 还必须在每个想要访问它的函数中声明变量 我就像 – 什么?! “还必须在每个想要访问它的函数中声明变量”。 然后,我又一次感到震惊: int max; /* … */ int main() { extern int max; /* … */ } 还有一个 – 什么?! 据我所知(显然,它并不多,而且远远不够), extern只有在某个地方定义一个全局变量并且你想通过另一个文件访问它时才有意义(不是再次定义它)。 所以: 在main或任何其他function中,这个extern int max什么意义? 该标准是否真的说,这是必须的 (我需要声明,对于这个例子,每个函数中的最大值 ,它将使用它吗?) C ++是否相同(这就是我放置C ++标签的原因)? 这是我第一次看到这样的东西。 注意:这与在函数内声明静态变量作为extern的用法有什么不同?

C fork处理全局变量

我不理解这个程序的输出: #include #include #include int i = 0; int main() { while(i<3) { fork(); printf("%d\n",i); ++i; } } 输出是: 0 1 2 2 1 2 0 1 2 2 2 1 2 2 可以请有人告诉我如何解决这个问题,以便完全理解为什么我得到这个输出?

全局变量实现

当我写下面的程序时: 档案1: #include int global; void print_global1() { printf(“%p\n”, &global); } 文件2: #include char global; void print_global2() { printf(“%p\n”, &global); } 档案3: void print_global1(); void print_global2(); int main() { print_global1(); print_global2(); return 0; } 输出: $ ./a.out 0x804a01c 0x804a01c 这是我的问题: 为什么链接器将“int global”和“char global”实现为相同的全局变量: 为什么编译器不会抱怨(不是最小的警告-Wall -Wextra -ansi …) 如何管理全局变量的大小(int和char的大小不同) PS:第二个问题是架构/编译器相关,所以让我们把gcc或Visual C ++(对于C)的int大小为32位 编辑:这不是C ++的问题,但对于C! 我使用gcc版本4.4.1和Ubuntu 9.10,这是编译控制台输出: […]

所有全局变量都应该是波动合格的吗?

在这个例子中,正确性是否要求将global_value声明为volatile ? int global_value = 0; void foo () { ++ global_value; } void bar () { some_function (++global_value); foo (); some_function (++global_value); } 我的理解是volatile是“用于” 映射内存和变量的指针,可以通过信号修改 (并且强调不是为了线程安全)但是很容易想象bar可能会编译成这样的东西: push EAX mov EAX, global_value inc EAX push EAX call some_function call foo inc EAX push EAX call some_function mov global_value, EAX pop EAX 这显然不正确,但即使没有volatile我认为根据C抽象机器它是有效的。 我错了还是有效? 如果是这样,在我看来, volatile常常被忽视。 […]

为什么我不能将值赋给C中函数外的全局变量?

假设我有一个全局变量,我想为它分配另一个变量。 我发现你可以为函数内的全局变量赋值: int i = 8; int main(void) { i = 9; /* Modifies i */ return 0; } 但是,在函数外部分配全局变量不起作用! int i = 8; i = 9; /* Compiler error */ int main(void) { return 0; } 我收到以下错误消息: warning: data definition has no type or storage class warning: type defaults to ‘int’ in declaration of […]

特定函数与许多参数与上下文相关

一个例子 假设我们有一个要写的文本,可以转换为“大写或小写”,并可以“​​左,中,右”打印。 具体案例实现(function太多) writeInUpperCaseAndCentered(char *str){//..} writeInLowerCaseAndCentered(char *str){//..} writeInUpperCaseAndLeft(char *str){//..} and so on… VS 许多Argument函数(糟糕的可读性,甚至在没有很好的自动完成IDE的情况下很难编写代码) write( char *str , int toUpper, int centered ){//..} VS 依赖于上下文(难以重用,难以编码,使用丑陋的全局变量,有时甚至无法“检测”上下文) writeComplex (char *str) { // analize str and perhaps some global variables and // (under who knows what rules) put it center/left/right and upper/lowercase } 也许还有其他选择..(并且欢迎) 问题是: 这个(经常性的)三难问题是否有任何良好的实践或经验/学术建议 ? 编辑: […]

为什么初始化一个全局变量,函数的返回值在声明时失败,但在文件范围内工作正常?

一个80k声誉贡献者R ..告诉我,我们不能用函数的返回值初始化全局变量,因为它不被认为是常量,全局变量必须用常量初始化。并且对他的话来说,我是真的按预期得到此程序的以下错误 – initializer element is not a constant是程序: #include int foo(); int gvar=foo(); //ERROR int main() { printf(“%d”,gvar); } int foo() { return 8; } 但在这种情况下,我只是不明白为什么上面的程序的后续更改版本根本没有显示任何错误并且工作正常。在第二个程序中,我使用相同函数foo()的返回值初始化相同的全局变量foo() 。你能告诉我这种结果变化的严格技术原因是什么?为什么用函数的返回值初始化全局变量会导致错误,但同样的返回值初始化工作正常从一个函数? #include int foo(); int gvar; int main() { gvar=foo(); printf(“%d”,gvar); } int foo() { return 8; } 输出 8

将可变长度数组声明为C中的全局变量

如何将可变长度数组声明为全局变量? 当在扫描长度之前在函数中声明可变长度数组时,它会编译但不会运行。 它给出了分段错误。 当相同的声明语句转移到扫描语句下方时,它运行正常。 如果我们想要一个全局可用于所有函数的可变长度数组,我们该怎么做? 这里的问题是数组的长度只能通过某些函数进行扫描。

使用nftw时如何避免使用全局变量

我想使用nftw遍历C中的目录结构。 但是,考虑到我想要做的事情,我没有看到使用全局变量的方法。 使用(n)ftw的教科书示例都涉及执行打印文件名等操作。 相反,我希望获取路径名和文件校验和并将它们放在数据结构中。 但考虑到可以传递给nftw的限制,我没有看到一个好方法。 我正在使用的解决方案涉及一个全局变量。 然后,nftw调用的函数可以访问该变量并添加所需的数据。 没有使用全局变量有没有合理的方法呢? 这是在stackoverflow上一篇文章中的交换,有人建议我将其作为后续发布。