- 浏览: 171478 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
boz.lee:
不错, 好多地方因为这里而出错
全局变量和局部变量在内存里的区别 -
issllx:
看到此文后对iteye深表遗憾
Yahoo S4 -
wohenshuaiba:
请问你有这个的代码吗?
k均值聚类(K-means) -
yxwang0615:
大神:
apr-1.3.3.tar.bz2
apr-util- ...
log4cxx编译方法 -
yxwang0615:
比csdn上的说的清楚干练,早看到这个就好了,我编了一天
p ...
log4cxx编译方法
答:
1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
# include <stdio.h>
char *p111 = "654321"; # 全局指针变量 已经初始化
static int c444 = 9; # 静态全局变量 已经初始化
static int c555; # 静态全局变量 未初始化
main()
{
int b222; # 局部变量
char s333[] = "abc"; # 局部变量
char *p222; # 局部变量
char *p333 = "123456"; # 局部变量
static int c444 =0; # 已初始化静态局部变量,与前面静态全局变量重名
p111 = (char *)malloc(10);
p222 = (char *)malloc(20);
}
[test@redhat]# gcc -o aaa ./aaa.c
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x80482d0
Start of program headers: 52 (bytes into file)
Start of section headers: 2040 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 7
Size of section headers: 40 (bytes)
Number of section headers: 27
Section header string table index: 24
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 08048114 000114 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048128 000128 000020 00 A 0 0 4
[ 3] .hash HASH 08048148 000148 00002c 04 A 4 0 4
[ 4] .dynsym DYNSYM 08048174 000174 000060 10 A 5 1 4
[ 5] .dynstr STRTAB 080481d4 0001d4 000053 00 A 0 0 1
[ 6] .gnu.version VERSYM 08048228 000228 00000c 02 A 4 0 2
[ 7] .gnu.version_r VERNEED 08048234 000234 000020 00 A 5 1 4
[ 8] .rel.dyn REL 08048254 000254 000008 08 A 4 0 4
[ 9] .rel.plt REL 0804825c 00025c 000018 08 A 4 b 4
[10] .init PROGBITS 08048274 000274 000017 00 AX 0 0 4
[11] .plt PROGBITS 0804828c 00028c 000040 04 AX 0 0 4
[12] .text PROGBITS 080482d0 0002d0 0001e4 00 AX 0 0 16
[13] .fini PROGBITS 080484b4 0004b4 00001b 00 AX 0 0 4
[14] .rodata PROGBITS 080484d0 0004d0 00001a 00 A 0 0 4
[15] .eh_frame PROGBITS 080484ec 0004ec 000004 00 A 0 0 4
[16] .data PROGBITS 080494f0 0004f0 00001c 00 WA 0 0 4
[17] .dynamic DYNAMIC 0804950c 00050c 0000c8 08 WA 5 0 4
[18] .ctors PROGBITS 080495d4 0005d4 000008 00 WA 0 0 4
[19] .dtors PROGBITS 080495dc 0005dc 000008 00 WA 0 0 4
[20] .jcr PROGBITS 080495e4 0005e4 000004 00 WA 0 0 4
[21] .got PROGBITS 080495e8 0005e8 00001c 04 WA 0 0 4
[22] .bss NOBITS 08049604 000604 000008 00 WA 0 0 4
[23] .comment PROGBITS 00000000 000604 000126 00 0 0 1
[24] .shstrtab STRTAB 00000000 00072a 0000ce 00 0 0 1
[25] .symtab SYMTAB 00000000 000c30 0004c0 10 26 2f 4
[26] .strtab STRTAB 00000000 0010f0 000275 00 0 0 1
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x000e0 0x000e0 R E 0x4
INTERP 0x000114 0x08048114 0x08048114 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x004f0 0x004f0 R E 0x1000
LOAD 0x0004f0 0x080494f0 0x080494f0 0x00114 0x0011c RW 0x1000
DYNAMIC 0x00050c 0x0804950c 0x0804950c 0x000c8 0x000c8 RW 0x4
NOTE 0x000128 0x08048128 0x08048128 0x00020 0x00020 R 0x4
STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 08048114 0 SECTION LOCAL DEFAULT 1
2: 08048128 0 SECTION LOCAL DEFAULT 2
3: 08048148 0 SECTION LOCAL DEFAULT 3
4: 08048174 0 SECTION LOCAL DEFAULT 4
5: 080481d4 0 SECTION LOCAL DEFAULT 5
6: 08048228 0 SECTION LOCAL DEFAULT 6
7: 08048234 0 SECTION LOCAL DEFAULT 7
8: 08048254 0 SECTION LOCAL DEFAULT 8
9: 0804825c 0 SECTION LOCAL DEFAULT 9
10: 08048274 0 SECTION LOCAL DEFAULT 10
11: 0804828c 0 SECTION LOCAL DEFAULT 11
12: 080482d0 0 SECTION LOCAL DEFAULT 12
13: 080484b4 0 SECTION LOCAL DEFAULT 13
14: 080484d0 0 SECTION LOCAL DEFAULT 14
15: 080484ec 0 SECTION LOCAL DEFAULT 15
16: 080494f0 0 SECTION LOCAL DEFAULT 16
17: 0804950c 0 SECTION LOCAL DEFAULT 17
18: 080495d4 0 SECTION LOCAL DEFAULT 18
19: 080495dc 0 SECTION LOCAL DEFAULT 19
20: 080495e4 0 SECTION LOCAL DEFAULT 20
21: 080495e8 0 SECTION LOCAL DEFAULT 21
22: 08049604 0 SECTION LOCAL DEFAULT 22
23: 00000000 0 SECTION LOCAL DEFAULT 23
24: 00000000 0 SECTION LOCAL DEFAULT 24
25: 00000000 0 SECTION LOCAL DEFAULT 25
26: 00000000 0 SECTION LOCAL DEFAULT 26
27: 080482f4 0 FUNC LOCAL DEFAULT 12 call_gmon_start
28: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
29: 080495d4 0 OBJECT LOCAL DEFAULT 18 __CTOR_LIST__
30: 080495dc 0 OBJECT LOCAL DEFAULT 19 __DTOR_LIST__
31: 080484ec 0 OBJECT LOCAL DEFAULT 15 __EH_FRAME_BEGIN__
32: 080495e4 0 OBJECT LOCAL DEFAULT 20 __JCR_LIST__
33: 080494f8 0 OBJECT LOCAL DEFAULT 16 p.0
34: 08049604 1 OBJECT LOCAL DEFAULT 22 completed.1
35: 08048320 0 FUNC LOCAL DEFAULT 12 __do_global_dtors_aux
36: 08048360 0 FUNC LOCAL DEFAULT 12 frame_dummy
37: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
38: 080495d8 0 OBJECT LOCAL DEFAULT 18 __CTOR_END__
39: 080495e0 0 OBJECT LOCAL DEFAULT 19 __DTOR_END__
40: 080484ec 0 OBJECT LOCAL DEFAULT 15 __FRAME_END__
41: 080495e4 0 OBJECT LOCAL DEFAULT 20 __JCR_END__
42: 08048490 0 FUNC LOCAL DEFAULT 12 __do_global_ctors_aux
43: 00000000 0 FILE LOCAL DEFAULT ABS aaa.c
44: 08049504 4 OBJECT LOCAL DEFAULT 16 c444 # static变量为LOCAL绑定属性(也即作用域) 已初始化静态变量存放在.data
45: 08049508 4 OBJECT LOCAL DEFAULT 16 c444.0 # 已初始化静态变量存放在.data (多个源文件可以定义同名的静态变量)
46: 08049608 4 OBJECT LOCAL DEFAULT 22 c555 # 未初始化静态变量存放在.bss
47: 080494fc 4 OBJECT GLOBAL DEFAULT 16 a111 # 全局变量为GLOBAL绑定属性 已初始全局变量存放在.data
48: 0804950c 0 OBJECT GLOBAL DEFAULT 17 _DYNAMIC
49: 080484d0 4 OBJECT GLOBAL DEFAULT 14 _fp_hw
50: 080494f0 0 NOTYPE GLOBAL HIDDEN ABS __fini_array_end
51: 080494f4 0 OBJECT GLOBAL HIDDEN 16 __dso_handle
52: 08048440 66 FUNC GLOBAL DEFAULT 12 __libc_csu_fini
53: 08048274 0 FUNC GLOBAL DEFAULT 10 _init
54: 0804829c 427 FUNC GLOBAL DEFAULT UND malloc@@GLIBC_2.0 55: 080482d0 0 FUNC GLOBAL DEFAULT 12 _start
56: 080494f0 0 NOTYPE GLOBAL HIDDEN ABS __fini_array_start
57: 080483f0 71 FUNC GLOBAL DEFAULT 12 __libc_csu_init
58: 08049500 4 OBJECT GLOBAL DEFAULT 16 p111
59: 08049604 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
60: 0804838c 89 FUNC GLOBAL DEFAULT 12 main
61: 080482ac 251 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC _
62: 080494f0 0 NOTYPE GLOBAL HIDDEN ABS __init_array_end
63: 080494f0 0 NOTYPE WEAK DEFAULT 16 data_start
64: 080484b4 0 FUNC GLOBAL DEFAULT 13 _fini
65: 080494f0 0 NOTYPE GLOBAL HIDDEN ABS __preinit_array_end
66: 08049604 0 NOTYPE GLOBAL DEFAULT ABS _edata
67: 080495e8 0 OBJECT GLOBAL DEFAULT 21 _GLOBAL_OFFSET_TABLE_
68: 0804960c 0 NOTYPE GLOBAL DEFAULT ABS _end
69: 080494f0 0 NOTYPE GLOBAL HIDDEN ABS __init_array_start
70: 080484d4 4 OBJECT GLOBAL DEFAULT 14 _IO_stdin_used
71: 080494f0 0 NOTYPE GLOBAL DEFAULT 16 __data_start
72: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
73: 080494f0 0 NOTYPE GLOBAL HIDDEN ABS __preinit_array_start
74: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
75: 080482bc 48 FUNC GLOBAL DEFAULT UND strcpy@@GLIBC_2.0
[test@redhat]# gdb ./aaa
GNU gdb 6.1.1
(gdb) disassemble main
Dump of assembler code for function main:
0x0804838c <main+0>: push %ebp
0x0804838d <main+1>: mov %esp,%ebp
0x0804838f <main+3>: sub $0x18,%esp
0x08048392 <main+6>: and $0xfffffff0,%esp
0x08048395 <main+9>: mov $0x0,%eax
0x0804839a <main+14>: sub %eax,%esp
0x0804839c <main+16>: mov 0x80484df,%eax # 0x80484df处为"abc",位于.rodata
0x080483a1 <main+21>: mov %eax,0xfffffff8(%ebp) # 0xfffffff8(%ebp) 为局部变量 char s333[]
0x080483a4 <main+24>: movl $0x80484e3,0xfffffff0(%ebp) # 0x80484e3处为"123456/0",位于.rodata; 0xfffffff0(%ebp) 为局部变量 char *p333
0x080483ab <main+31>: sub $0xc,%esp
0x080483ae <main+34>: push $0xa # 0xa=10 ; push $0xa后,此时堆栈esp值又减去4字节,相当于sub $0x10,%esp
0x080483b0 <main+36>: call 0x804829c <malloc>
0x080483b5 <main+41>: add $0x10,%esp
0x080483b8 <main+44>: mov %eax,0x8049500 # 0x8049500 为全局变量p111,位于.data
0x080483bd <main+49>: sub $0xc,%esp
0x080483c0 <main+52>: push $0x14 # 0x14=20 ; push $0xa后,此时堆栈esp值又减去4字节,相当于sub $0x10,%esp
0x080483c2 <main+54>: call 0x804829c <malloc>
0x080483c7 <main+59>: add $0x10,%esp
0x080483ca <main+62>: mov %eax,0xfffffff4(%ebp) # 0xfffffff4(%ebp) 为局部变量p222
0x080483cd <main+65>: sub $0x8,%esp
0x080483d0 <main+68>: push $0x80484e3 # 0x80484e3处内容为"123456/0",位于.rodata;
0x080483d5 <main+73>: pushl 0x8049500 # 0x8049500 为全局变量p111,位于.data
0x080483db <main+79>: call 0x80482bc <strcpy>
0x080483e0 <main+84>: add $0x10,%esp
0x080483e3 <main+87>: leave
0x080483e4 <main+88>: ret
0x080483e5 <main+89>: nop
0x080483e6 <main+90>: nop
0x080483e7 <main+91>: nop
0x080483e8 <main+92>: nop
0x080483e9 <main+93>: nop
0x080483ea <main+94>: nop
0x080483eb <main+95>: nop
0x080483ec <main+96>: nop
0x080483ed <main+97>: nop
0x080483ee <main+98>: nop
0x080483ef <main+99>: nop
End of assembler dump.
(gdb) q
[test@redhat]#
发表评论
-
小对象的分配技术
2011-03-21 12:01 1466小对象分配技术是Loki提高效率的有效途径,Loki里广 ... -
Techniques of Protocol Buffers Developer Guide
2010-12-07 10:39 1124Techniques Streaming Multip ... -
Protocol Buffer Basics: C++
2010-12-07 10:38 1034Protocol Buffer Basics: C++ ... -
Encoding of Protocol Buffers Developer Guide
2010-12-07 10:37 940Encoding A Simple Message ... -
Style Guide of Protocol Buffers Developer Guide
2010-12-07 10:36 786Style Guide This document pr ... -
Language Guide of Protocol Buffers Developer Guide
2010-12-07 10:34 1048Language Guide Defining A M ... -
Overview of Protocol Buffers Developer Guide
2010-12-07 10:31 682Developer Guide Welcome to t ... -
字节序
2010-12-01 21:03 953这几天又开始做网络方面的应用了,既然是网络编程,字节序肯定 ... -
JobFlow要继续考虑的问题
2010-09-17 22:35 938小记: 1.把作业队列的概念扩展为作业池JobPool,提供 ... -
C++单例不可继承
2010-09-17 17:24 1490C++语言和单例的特性决定了单例不可继承。 单例有如下几项要 ... -
C++静态成员与静态成员函数小结
2010-09-16 15:48 1055类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态 ... -
log4cxx编译方法
2010-09-08 10:30 19991、下载http://logging.apache.o ... -
优秀的框架工具
2010-09-08 10:13 1139zookeeper Hadoop的子项目,可靠地分布式小文件 ... -
关于auto_ptr的忠告
2010-08-26 16:21 9211.auto_ptr不能用于数组,因为它调用的是delet ... -
snprintf与strncpy效率对比
2010-07-20 09:31 1583一直以为strncpy效率优于snprintf. 无意中在网上 ... -
用Valgrind查找内存泄漏和无效内存访问
2010-07-20 09:29 1958Valgrind是x86架构Linux上的多重用途代码剖析和内 ... -
头文件互包含于名字空间的相关问题
2010-07-17 20:27 1057c/c++里面头文件的使用 ... -
C++库介绍
2010-04-02 16:30 1522基础类1、 Dinkumware C++ ... -
C++中头文件相互包含的几点问题
2010-04-02 16:29 1029一、类嵌套的疑问 C++ ...
相关推荐
根据给定的文件信息,我们将深入探讨全局变量、局部变量、静态全局变量及静态局部变量之间的区别,以及`static`关键字在面向过程与面向对象编程中的不同应用。 ### 面向过程设计中的`static` #### 全局变量 全局...
全局变量、局部变量、静态全局变量、静态局部变量这四种变量类型,各自拥有不同的作用域和生命周期,它们之间的区别对于编写高效、可维护的代码至关重要。 ### 全局变量(Global Variable) 全局变量是在所有函数...
从分配内存空间看,全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量...
全局变量和局部变量在内存管理上有显著的区别,这主要体现在它们的存储区域、生命周期和作用域上。在C/C++编程中,程序的内存被划分为五个主要区域: 1. **栈区(Stack)**:栈是用于存放函数参数、局部变量的地方...
为了更好地理解全局变量和局部变量,我们首先需要对程序在内存中的分布有所了解。程序在运行时,操作系统会为其分配一系列的内存区域,每个区域都有特定的作用。 1. **代码区**:存放程序的代码部分,包括各种函数...
在C语言中,全局变量和局部变量是程序中存储数据的两种主要方式,它们各自具有独特的特性和使用场景。理解并熟练运用这两种变量对于进行C语言单片机编程至关重要。 全局变量是在函数外部定义的变量,它在整个程序的...
本文涵盖了C语言面试题大汇总之华为面试题,涉及到局部变量、全局变量、extern关键字、for循环、while循环、静态变量、静态函数、内存分配、typedef和struct等知识点,对于C语言学习和面试有重要参考价值。
按照存储区域来划分,全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区(也称为静态存储区),而局部变量则存放在内存的栈区。 1. **全局变量**:在程序的整个执行过程中始终存在,即使在函数调用...
全局变量、局部变量及静态变量在作用域、存储位置、生命周期等方面有着明显的区别。正确理解和使用这些变量类型对于编写高质量、易于维护的代码至关重要。通过上述介绍,希望您能够更好地掌握这些基本概念,并能在...
全局变量和局部变量是编程语言中两种不同的变量类型,它们在C++中有着明确的差异,主要体现在作用域、内存分配、生命周期以及对外链接性四个方面。 1. **作用域(Scope)** - **全局变量**:全局变量在整个程序...
在MATLAB中,全局变量和局部变量是两个重要的概念,它们在函数中的作用域和使用方法不同。在本文中,我们将详细介绍全局变量和局部变量的定义、作用域和使用方法,并通过实例来加深理解。 一、全局变量 在MATLAB中...
在程序设计中,正确理解局部变量、全局变量、堆和堆栈的概念对于编写高效、安全的代码至关重要。合理地利用这些内存管理技术可以显著提高程序的性能和可维护性。例如,对于频繁使用的大型数据结构,应考虑使用堆区...
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。 – 程序结束后由系统...
3. **全局变量与局部变量的区别**:全局变量存放在数据段中,而局部变量则位于栈中。局部变量在函数调用结束时会被释放,而全局变量在整个程序运行期间都占用固定的存储空间。 总结而言,了解并掌握函数的声明与...
2.1.4 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
局部变量、全局变量、堆、堆栈、静态和全局变量都是编程中常见的概念,它们在内存管理、作用域和生命周期等方面有着不同的特点。 首先,局部变量是在函数内部声明的变量,它们在函数执行时分配空间,在函数结束时被...
7. 内存分配:全局变量和静态局部变量存储在数据段,非静态局部变量存储在栈上。 理解全局变量和局部变量的差异及其使用规则,有助于编写清晰、可维护的C语言程序。在实际编程中,根据需求合理选择变量类型,可以...
浅谈java中的局部变量和全局变量 Java 中的变量可以分为两大类:局部变量和全局变量。理解这两种变量的概念、生存时间和创建位置是java开发者必须具备的基本知识。下面我们将对java中的局部变量和全局变量进行详细...
4. **内存管理**:全局变量占用静态存储区域,它们在程序执行期间一直存在,直到程序结束。 5. **数据安全**:全局变量可以被程序任何部分修改,这可能导致数据不一致和难以调试的问题。如果可能,应优先考虑使用...
在Android开发中,理解并恰当使用全局变量和局部变量是非常重要的。全局变量和局部变量是程序设计中的基本概念,它们各自有不同的作用域和生命周期,因此在编写代码时需要根据需求来选择合适的变量类型。 全局变量...