加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

C程序设计语言--全局变量的理解

发布时间:2021-12-13 11:32:12 所属栏目:PHP教程 来源:互联网
导读:全局变量是C语言语法和语义中一个很重要的知识点,首先它的存在意义需要从三个不同角度去理解:对于程序员来说,它是一个记录内容的变量(variable);对于编译/链接器来说,它是一个需要解析的符号(symbol);对于计算机来说,它可能是具有地址的一块内存(memo

全局变量是C语言语法和语义中一个很重要的知识点,首先它的存在意义需要从三个不同角度去理解:对于程序员来说,它是一个记录内容的变量(variable);对于编译/链接器来说,它是一个需要解析的符号(symbol);对于计算机来说,它可能是具有地址的一块内存(memory)。其次是语法/语义:从作用域上看,带static关键字的全局变量范围只能限定在文件里,否则会外联到整个模块和项目中;从生存期来看,它是静态的,贯穿整个程序或模块运行期间(注意,正是跨单元访问和持续生存周期这两个特点使得全局变量往往成为一段受攻击代码的突破口,了解这一点十分重要);从空间分配上看,定义且初始化的全局变量在编译时在数据段(.data)分配空间,定义但未初始化的全局变量暂存(tentative definition)在.bss段,编译时自动清零,而仅仅是声明的全局变量只能算个符号,寄存在编译器的符号表内,不会分配空间,直到链接或者运行时再重定向到相应的地址上。
我们将向您展现一下,非static限定全局变量在编译/链接以及程序运行时会发生哪些有趣的事情,顺便可以对C编译器/链接器的解析原理管中窥豹。以下示例对ANSI C和GNU C标准都有效,笔者的编译环境是Ubuntu下的GCC-4.4.3。
 
 
第一个例子
/* t.h */
#ifndef _H_
#define _H_
inta;
#endif
 
/* foo.c */
#include <stdio.h>
#include "t.h"
 
struct{
  chara;
  intb;
} b = { 2, 4 };
 
intmain();
 
voidfoo()
{
    printf("foo:t(&a)=0x%08xnt(&b)=0x%08xn
        tsizeof(b)=%dntb.a=%dntb.b=%dntmain:0x%08xn",
        &a, &b,sizeof b, b.a, b.b, main);
}
 
/* main.c */
#include <stdio.h>
#include "t.h"
 
intb;
intc;
 
intmain()
{
    foo();
    printf("main:t(&a)=0x%08xnt(&b)=0x%08xn
        t(&c)=0x%08xntsize(b)=%dntb=%dntc=%dn",
        &a, &b, &c,sizeof b, b, c);
    return0;
}
 
Makefile如下:
 
 test: main.o foo.o
    gcc -otest main.o foo.o
 
main.o: main.c
foo.o: foo.c
 
clean:
    rm*.o test
 
运行情况:
 
 foo:    (&a)=0x0804a024
    (&b)=0x0804a014
    sizeof(b)=8
    b.a=2
    b.b=4
    main:0x080483e4
main:  (&a)=0x0804a024
    (&b)=0x0804a014
    (&c)=0x0804a028
    size(b)=4
    b=2
    c=0

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读